【发布时间】:2013-04-12 22:30:49
【问题描述】:
我想知道哪种方法是检测 WPF 窗口何时首次显示的正确方法?
【问题讨论】:
-
WinForms 有一个 Shown 事件,但我认为它在 WPF 中不可用。 MayeInitialized是正确的使用方式
我想知道哪种方法是检测 WPF 窗口何时首次显示的正确方法?
【问题讨论】:
有一个名为Loaded 的事件,您可以使用它来确定您的窗口何时准备就绪。
来自MSDN
在元素布局、渲染并准备好交互时发生。
在 XAML 中设置处理程序
<StackPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.FELoaded"
Loaded="OnLoad"
Name="root">
</StackPanel>
添加代码
void OnLoad(object sender, RoutedEventArgs e)
{
Button b1 = new Button();
b1.Content = "New Button";
root.Children.Add(b1);
b1.Height = 25;
b1.Width = 200;
b1.HorizontalAlignment = HorizontalAlignment.Left;
}
【讨论】:
Loaded 事件实际上发生在第一次渲染之前。
Form.Shown,而不是等效于 Form.Loaded。 WPF 不会使这成为一个微不足道的翻译。该线程 (stackoverflow.com/questions/9191256/window-shown-event-in-wpf) 建议使用您自己的标志覆盖 OnContentRendered 以跟踪它是否是第一次。
我建议做一个 bool 标志并检查它,并在构造函数中将其设置为 true
bool FirstTime = true;
void OnLoad(object sender, RoutedEventArgs e)
{
if (FirstTime)
{
FirstTime = false;
//do your stuff first-time
}
else
{
//do your stuff for other
}
}
【讨论】:
else 子句,因为OnLoad 只会被调用一次。第一次之前的窗口是Shown。 OP 的问题是 WPF 没有 Window.OnShown 微不足道的等价物。
Loaded 可以多次调用。
The Loaded event and the Initialized event
根据我的测试和上面的链接,Loaded 事件可以被多次触发。
因此,您需要在 OnLoaded 处理程序中设置一个标志。
例如,如果 Stack Panel 在 TabItem 控件中,则每次进入 tab 时都会调用loaded。
【讨论】: