是否可以链接计时器和Window_Loaded事件



是否可以像这样在Timer.Tick事件上触发Window_Loaded

DispatcherTimer timer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(1)
};
timer.Tick += Window_Loaded;
timer.Start();                  

或者还有别的办法吗?

您的问题可能会混淆事件和事件处理程序。在C#中,事件只能从声明的类中引发,除非它们公开了可以从外部调用的internalpublic方法。但是,在FrameworkElement中定义的Loaded事件不会以这种方式公开,这意味着您不能从代码中引发它。

您的代码所做的是为Loaded事件添加Window_Loaded事件处理程序,这只是一个方法。然而,对应的TickLoaded委托的签名不匹配。

  • Tick-public delegate void EventHandler(object? sender, EventArgs e);
  • Loaded-public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);

为了将窗口加载的事件处理程序添加到Tick事件,您必须创建一个与Tick委托匹配的方法或lambda,并使用适当的参数调用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问题。

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)
{
}

最新更新