Как изменить содержимое метки с помощью таймеров, генерирующих исключение InvalidOperationException - PullRequest
4 голосов
/ 26 апреля 2010

Я делаю приложение и использую таймер в этом приложении для изменения содержимого метки в WPF C # .NET.

В истекшем событии таймера я пишу следующий код

lblTimer.Content = "hello";

но он выдает InvalidOperationException и выдает сообщение Вызывающий поток не может получить доступ к этому объекту, так как он принадлежит другому потоку.

Я использую .NET Framework 3.5 и WPF с C #.

Пожалуйста, помогите мне.
Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 22 мая 2012

Для .NET 4.0 гораздо проще использовать DispatcherTimer. Затем обработчик событий находится в потоке пользовательского интерфейса, и он может напрямую устанавливать свойства элемента управления.

private DispatcherTimer updateTimer;

private void initTimer
{
     updateTimer = new DispatcherTimer(DispatcherPriority.SystemIdle); 
     updateTimer.Tick += new EventHandler(OnUpdateTimerTick);
     updateTimer.Interval = TimeSpan.FromMilliseconds(1000);
     updateTimer.Start();
}

private void OnUpdateTimerTick(object sender, EventArgs e)
{
    lblTimer.Content = "hello";
}
3 голосов
/ 26 апреля 2010

lblTimer было объявлено в основном потоке графического интерфейса, и вы пытаетесь обновить его из другого потока -> вы получаете эту ошибку.

Эта ссылка «Доступ к элементам управления WPF в потоке без пользовательского интерфейса» содержит описание вашей проблемы и ее решение.

1 голос
/ 26 апреля 2010

InvokeRequired не работает в wpf.

Правильный способ обновления элемента графического интерфейса, принадлежащего другому потоку, таков:

Объявите это на уровне модуля:

delegate void updateLabelCallback(string tekst);

Это метод обновления ярлыка:

private void UpdateLabel(string tekst)
    {
        if (label.Dispatcher.CheckAccess() == false)
        {
            updateLabelCallback uCallBack = new updateLabelCallback(UpdateLabel);
            this.Dispatcher.Invoke(uCallBack, tekst);
        }
        else
        { 
    //update your label here
        }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...