我看到一个代码示例创建了一个方法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()
等方法?
答案 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事件。