none
WPF 中 BeginInit /EndInit 事件 的疑问 RRS feed

  • 问题

  •     /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Activated(object sender, EventArgs e)
            {
                Debug.WriteLine("触发 WindowActivated 事件");
            }
    
            private void Window_Deactivated(object sender, EventArgs e)
            {
                Debug.WriteLine("触发 WindowDeactivated 事件");
            }
    
            protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
            {
                base.OnClosing(e);
    
                Debug.WriteLine("触发 OnClosing 事件");
            }
    
            protected override void OnClosed(EventArgs e)
            {
                base.OnClosed(e);
    
                Debug.WriteLine("触发 OnClosed 事件");
            }
    
            protected override void OnInitialized(EventArgs e)
            {
                base.OnInitialized(e);
    
                Debug.WriteLine("触发 OnInitialized 事件");
            }
    
            public override void BeginInit()
            {
                base.BeginInit();
    
                Debug.WriteLine("触发 BeginInit 事件");
            }
    
            public override void EndInit()
            {
                base.EndInit();
    
                Debug.WriteLine("触发 EndInit 事件");
            }
    
            protected override void OnActivated(EventArgs e)
            {
                base.OnActivated(e);
    
                Debug.WriteLine("触发 OnActivated 事件");
            }
    
            protected override void OnDeactivated(EventArgs e)
            {
                base.OnDeactivated(e);
    
                Debug.WriteLine("触发 OnDeactivated 事件");
            }
    
            protected override void OnContentChanged(object oldContent, object newContent)
            {
                base.OnContentChanged(oldContent, newContent);
    
                Debug.WriteLine("触发 OnContentChanged 事件");
            }
    
            protected override void OnContentRendered(EventArgs e)
            {
                base.OnContentRendered(e);
    
                Debug.WriteLine("触发 OnContentRendered 事件");
            }
    
    
        }

    运行结果是:

    触发 BeginInit 事件
    触发 OnContentChanged 事件
    触发 OnInitialized 事件
    触发 EndInit 事件
    触发 BeginInit 事件
    触发 EndInit 事件
    触发 WindowActivated 事件
    触发 OnActivated 事件
    触发 OnContentRendered 事件
    触发 OnClosing 事件
    触发 WindowDeactivated 事件
    触发 OnDeactivated 事件
    触发 OnClosed 事件

    请问为何会在初始化时候调用2次BeginInit/EndInit 2次呢?

    2014年4月25日 1:17

答案

  • 参考你的上一个问题,第一次是在你的构造函数里面调用InitializeComponent()时产生的BeginInit/EndInit,另外一次是在系统自动调用InitializeComponent()时产生的BeginInit/EndInit。

    //以下是构造函数里面调用InitializeComponent()时产生
    触发 BeginInit 事件
    触发 OnContentChanged 事件
    触发 OnInitialized 事件
    触发 EndInit 事件
    //构造系统调用InitializeComponent()时产生
    触发 BeginInit 事件
    触发 EndInit 事件
    //
    触发 WindowActivated 事件
    触发 OnActivated 事件
    触发 OnContentRendered 事件
    触发 OnClosing 事件
    触发 WindowDeactivated 事件
    触发 OnDeactivated 事件
    触发 OnClosed 事件;

    • 已标记为答案 Wayne1900 2014年4月25日 5:20
    2014年4月25日 3:04