Обновление содержимого метки каждую секунду 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();