Обновление содержимого метки каждую секунду WPF
Я пытаюсь обновить содержимое метки каждую секунду. Поэтому я определяю два метода, как показано ниже. Я использую startStatusBarTimer()
в моем конструкторе Window
.
код:
private void startStatusBarTimer()
{
System.Timers.Timer statusTime = new System.Timers.Timer();
statusTime.Interval = 1000;
statusTime.Elapsed += new System.Timers.ElapsedEventHandler(statusTimeElapsed);
statusTime.Enabled = true;
}
private void statusTimeElapsed(object sender, ElapsedEventArgs e)
{
lblNow.Content = DateTime.Now.ToString("yyyy/MM/dd");
}
но я получаю эту ошибку:
вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет.
что не так? Или что я могу сделать?
2 ответов
вы столкнулись с потоку вопрос. Так как прошедшее событие вызывается на background thread
, вы не можете получить доступ к элементам управления UI из фонового потока. Вы должны поставить свое действие на UI dispatcher
Так что он получает отправку в поток UI -
private void statusTimeElapsed(object sender, ElapsedEventArgs e)
{
App.Current.Dispatcher.Invoke((Action)delegate
{
lblNow.Content = DateTime.Now.ToString("yyyy/MM/dd");
});
}
или
можно использовать DispatcherTimer
который построен специально для этой цели. Вы можете получить доступ к элементам управления UI из его Tick
обработчик событий. См. образец здесь MSDN.
просто используйте следующий код для обновления любого элемента управления в приложении WPF.вы должны пройти этот класс в том же пространстве имен.
public static class ExtensionMethods
{
private static Action EmptyDelegate = delegate() { };
public static void Refresh(this UIElement uiElement)
{
uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
}
}
после этого использовать следующее.
lable1.Refresh();