【发布时间】:2011-03-19 04:40:42
【问题描述】:
我想在第一次显示窗口或控件时运行一些代码。我不能使用 Loaded,因为它可以多次触发。我不能使用 Initialized,因为这是由构造函数完成的。
两者之间有事件吗?
【问题讨论】:
我想在第一次显示窗口或控件时运行一些代码。我不能使用 Loaded,因为它可以多次触发。我不能使用 Initialized,因为这是由构造函数完成的。
两者之间有事件吗?
【问题讨论】:
不幸的是,没有这样的事件。您可以在 Loaded Method 中使用布尔值来确保您的东西只触发一次 -
if(!IsSetUp)
{
MySetUpFunction();
IsSetUp = true;
}
在此处查看 WPF Windows 生命周期事件:
http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events
(来源:microsoft.com)
【讨论】:
Window继承自FrameworkElement:msdn.microsoft.com/en-us/library/…
Loaded可以多次开火,我错过了什么?
除了存储布尔标志之外,您还可以使用扩展方法并将包装委托给伪造的 Loaded 只触发一次。
public static void OnLoadedOnce(
this UserControl control,
RoutedEventHandler onLoaded)
{
if (control == null || onLoaded == null)
{
throw new ArgumentNullException();
}
RoutedEventHandler wrappedOnLoaded = null;
wrappedOnLoaded = delegate(object sender, RoutedEventArgs e)
{
control.Loaded -= wrappedOnLoaded;
onLoaded(sender, e);
};
control.Loaded += wrappedOnLoaded;
}
...
class MyControl : UserControl
{
public MyControl()
{
InitializeComponent();
this.OnLoadedOnce(this.OnControlLoaded /* or delegate {...} */);
}
private void OnControlLoaded(object sender, RoutedEventArgs e)
{
}
}
【讨论】:
如果你不想使用布尔方法做事,那么你可以创建一个方法并用它订阅Loaded事件,然后在该方法结束时取消订阅。
例子:
public MyDependencyObject(){
Loaded += OnLoaded;
}
private void OnLoaded(object sender, EventArgs args){
DoThings();
Loaded -= OnLoaded;
}
【讨论】: