Возможно ли связать таймер и событие Window_Loaded?

#c# #wpf #timer

#c# #wpf #таймер

Вопрос:

Возможно ли вызвать Window_Loaded Timer.Tick подобное событие?

 DispatcherTimer timer = new DispatcherTimer
{
    Interval = TimeSpan.FromSeconds(1)
};

timer.Tick  = Window_Loaded;
timer.Start();                  
  

Или есть другой способ сделать это?

Комментарии:

1. Итак, вы хотите выполнить действие, которое вы выполняете при загрузке окна снова и снова? Что вы делаете в window_loaded, чего не может сделать модель представления? Если я понимаю, что здесь происходит, вы хотите обновить окно, когда что-то изменится. Скорее всего, вы не реализовали INotifyPropertyChanged, и в модели представления нет знака. прочитайте о привязке и о том, как это работает.

Ответ №1:

Ваш вопрос, вероятно, путает события и обработчики событий. В C # события могут быть вызваны только из класса, в котором они были объявлены, если только они не предоставляют internal public метод or, который может быть вызван извне. Однако Loaded событие, определенное в FrameworkElement , не отображается таким образом, что означает, что вы не можете вызвать его из своего кода.

Что делает ваш код, так это добавляет Window_Loaded обработчик события для Loaded события, который является просто методом. Однако сигнатуры соответствующего Tick и Loaded делегатов не совпадают.

Чтобы добавить обработчик события window loaded к Tick событию, вы должны создать метод или лямбда-выражение, которое соответствует Tick делегату и вызывает Window_Loaded с соответствующими аргументами, например:

 timer.Tick  = OnTick;
  
 private void OnTick(object sender, EventArgs e)
{
   var routedEventArgs = new RoutedEventArgs();
   // ...set the routed event args properties.

   Window_Loaded(sender, routedEventArgs);
}
  

Предостережение.Хотя это может решить вашу проблему, скорее всего, это неправильный подход к тому, чего вы хотите достичь. Loaded Событие вызывается фреймворком в жизненном цикле элемента управления.

Происходит, когда элемент выложен, визуализирован и готов к взаимодействию.

Все, что вы делаете в своем Window_loaded обработчике событий, не должно выполняться периодически, потому что это не соответствует семантике этого события. Возможно, это проблема XY.

Ответ №2:

     public MainWindow()
    {
        InitializeComponent();

        DispatcherTimer timer = new DispatcherTimer
        {
            Interval = TimeSpan.FromSeconds(1)
        };

        timer.Tick  = Window_Loaded;
        timer.Start();
    }

    private void Window_Loaded(object sender, EventArgs e)
    {

    }

  

Комментарии:

1. Хотя технически это отвечает на вопрос, Window_Loaded лучше подходит для загруженного маршрутизируемого события для окна WPF. Следует включить дополнительные пояснения.