WPF:Initialized和Loaded事件之间有什么关系?

Jon*_*len 21 c# wpf events window

我想在首次显示Window或Control时运行一些代码.我不能使用Loaded,因为它可以不止一次.我不能使用Initialized,因为这是由构造函数完成的.

介于两者之间的事件吗?

bre*_*dan 31

不幸的是没有这样的事件.您可以在Loaded Method中使用布尔值来确保您的东西仅触发一次 -

if(!IsSetUp)
{
   MySetUpFunction();
   IsSetUp = true;
}
Run Code Online (Sandbox Code Playgroud)

在这里查看WPF Windows生命周期事件:

http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events

alt text http://i.msdn.microsoft.com/dynimg/IC155674.png

  • 嗯,这是愚蠢的,我不应该使用这样的保护条款.但这是正确的答案,所以这就是你的观点. (6认同)
  • 同意 - 如果这是您经常做的事情,您可以创建自己的窗口类继承自 window 并在整个项目中实现一个事件。 (2认同)
  • 另请参阅:http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx (2认同)
  • 从这张照片中,我没有看到“加载”可以多次发射,我错过了什么? (2认同)

Duc*_*tro 6

作为存储布尔标志的替代方法,您可以使用扩展方法并将包装委托给伪造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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您不想使用布尔方法来做事,那么您可以创建一个方法并Loaded用它订阅事件,然后在该方法结束时取消订阅。

例子:

public MyDependencyObject(){
  Loaded += OnLoaded;
}

private void OnLoaded(object sender, EventArgs args){
  DoThings();
  Loaded -= OnLoaded;
}
Run Code Online (Sandbox Code Playgroud)