我试图在窗口准备好时执行代码。
具体来说,我正在尝试使窗口最大化。问题是我无法在 InitializeComponent
之后同步运行此代码,因为它太快了(窗口尚未准备好/加载/显示,因此设置 Presenter
无效)
问题是 WinUI 3(版本 1.0)似乎没有公开 Window.Loaded
事件。
这是我当前的技巧。在构造函数中(在 InitializeComponent
之后),我 Hook 了 WinUI 3 公开的唯一事件之一,Activated
Activated += MainWindow_Activated_FirstTime;
问题是,只要窗口聚焦,它就会触发,几乎。所以解决方法是我只是删除事件处理程序内的事件处理程序
private void MainWindow_Activated_FirstTime(object sender, WindowActivatedEventArgs args)
{
SetupWindow();
Activated -= MainWindow_Activated_FirstTime;
}
(SetupWindow
设置窗口呈现器)
现在,就像我说的,这有效,但我认为它非常hacky。我想知道是否有正确的方法来 Hook Loaded
或者一些等效的事件,例如 Ready
或 Rendered
。我真的不在乎我喜欢什么,只要它比这更好。
最佳答案
如果您已将窗口的 Content
属性设置为 FrameworkElement
,例如任何类型的 Panel
,您可以处理此事件的 Loaded
事件。
您还可以使用 DispatcherQueue
将一些低优先级的工作排入队列,以便在调度程序线程准备好后立即完成:
public MainWindow()
{
this.InitializeComponent();
Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread().TryEnqueue(
Microsoft.UI.Dispatching.DispatcherQueuePriority.Low,
new Microsoft.UI.Dispatching.DispatcherQueueHandler(() =>
{
//...
}));
}
关于c# - WinUI 3 1.0 : Window Ready Event,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71181437/