【问题标题】:WPF: What is between the Initialized and Loaded event?WPF:初始化和加载事件之间是什么?
【发布时间】:2011-03-19 04:40:42
【问题描述】:

我想在第一次显示窗口或控件时运行一些代码。我不能使用 Loaded,因为它可以多次触发。我不能使用 Initialized,因为这是由构造函数完成的。

两者之间有事件吗?

【问题讨论】:

    标签: c# wpf events window


    【解决方案1】:

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

    if(!IsSetUp)
    {
       MySetUpFunction();
       IsSetUp = true;
    }
    

    在此处查看 WPF Windows 生命周期事件:

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


    (来源:microsoft.com

    【讨论】:

    • 那太愚蠢了,我不应该使用这样的保护子句。但这是正确的答案,所以这就是你的意思。
    • 同意 - 你可以创建自己的窗口类,继承自 window 并在整个项目中实现一个事件,如果这是你经常做的事情。
    • 确实有这样的事件,由Window继承自FrameworkElement:msdn.microsoft.com/en-us/library/…
    • 从这张图片中,我看不出Loaded可以多次开火,我错过了什么?
    【解决方案2】:

    除了存储布尔标志之外,您还可以使用扩展方法并将包装委托给伪造的 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)
        {
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      例子:

      public MyDependencyObject(){
        Loaded += OnLoaded;
      }
      
      private void OnLoaded(object sender, EventArgs args){
        DoThings();
        Loaded -= OnLoaded;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-16
        • 2020-10-17
        • 2017-05-30
        • 1970-01-01
        • 2015-07-15
        • 2012-12-27
        • 1970-01-01
        • 2011-04-28
        相关资源
        最近更新 更多