#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
делегатов не совпадают.
Tick
—public delegate void EventHandler(object? sender, EventArgs e);
Loaded
—public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
Чтобы добавить обработчик события 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. Следует включить дополнительные пояснения.