为什么要在XAML Window.Loaded调用的方法中运行代码?

时间:2009-03-16 15:50:47

标签: wpf architecture cross-platform conceptual

我看到一个代码示例创建了一个方法Window_Loaded(),该方法由XAML的“Window Loaded”事件调用:

<Window x:Class="TestModuleLoader.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
    <Grid>
        ...
    </Grid>
</Window>

但是在后面的代码中,代码在构造函数和Window_Loaded()方法中都有效:

using System.Windows;

namespace TestModuleLoader
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //what advantages do I have running code here? 
        }
    }
}

这样做有什么好处吗?

在ASP.NET中是否存在“窗口加载周期”,这有助于了解,例如PreRender()PostRender()等方法?

2 个答案:

答案 0 :(得分:12)

是的,WPF控件有一个类似的生命周期,就像在ASP.NET中一样。 WPF控件的生命周期更简单,因为它基本上是初始化,加载和卸载事件(按此顺序)。参见:

http://msdn.microsoft.com/en-us/library/ms754221.aspx

和迈克希尔伯格有一篇很好的文章,展示了初始化和加载事件之间的区别:

http://blogs.msdn.com/mikehillberg/archive/2006/09/19/LoadedVsInitialized.aspx

答案 1 :(得分:3)

优秀的链接,Razzie。

Edward - 你会发现最有趣的区别在于Contructor始终是在Window / Page / UserControl上调用的第一个方法,并且你不能指望所有DependencyProperties已被初始化为它们的最终值。此外,建议从构造函数中调用任何虚方法。

相反,Loaded事件通常在初始化过程结束时调用...即,当Window / Page / UserControl已完全加载到WPF ElementTree中时。在您加载的事件中,您可以放心地调用任何方法并修改任何DepenencyProperty,而不会有意外结果的风险。

一个不错的模式(我目前在我的项目中使用)是在Loaded事件中初始化自定义依赖项属性,如果它们在初始化期间未被修改。对于控件,此模式允许您避免初始化“昂贵”属性(如DependencyProperty,这是一个ObservableCollection),如果它们被覆盖(即通过调用代码的属性绑定)。

简单回答:如果您不确定如何安全地重载构造函数,请使用Loaded事件。