我认为这两个事件之间几乎没有区别。为了理解这一点,我创建了一个简单的操作示例:
XAML
<Window x:Class="LoadedAndContentRendered.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="MyWindow"
Title="MainWindow" Height="1000" Width="525"
WindowStartupLocation="CenterScreen"
ContentRendered="Window_ContentRendered"
Loaded="Window_Loaded">
<Grid Name="RootGrid">
</Grid>
</Window>
Code behind
private void Window_ContentRendered(object sender, EventArgs e)
{
MessageBox.Show("ContentRendered");
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
MessageBox.Show("Loaded");
}
在这种情况下,消息Loaded 出现在消息ContentRendered 之后的第一个位置。这证实了文档中的信息。
一般来说,在 WPF 中,如果元素满足以下条件,就会触发 Loaded 事件:
已布局、渲染并准备好进行交互。
由于在 WPF 中 Window 是同一个元素,但它通常应该是排列在根面板中的内容(例如:Grid)。因此,要监视Window 的内容并创建ContentRendered 事件。来自 MSDN 的备注:
如果窗口没有内容,则不会引发此事件。
也就是说,如果我们创建一个Window:
<Window x:Class="LoadedAndContentRendered.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="MyWindow"
ContentRendered="Window_ContentRendered"
Loaded="Window_Loaded" />
它只适用于Loaded 事件。
关于访问Window 中的元素,它们的工作方式相同。让我们在Window 的主要Grid 中创建一个Label。在这两种情况下,我们都成功获得了对Width的访问权限:
private void Window_ContentRendered(object sender, EventArgs e)
{
MessageBox.Show("ContentRendered: " + SampleLabel.Width.ToString());
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
MessageBox.Show("Loaded: " + SampleLabel.Width.ToString());
}
至于Styles和Templates,现阶段已成功应用,在这些事件中我们将能够访问它们。
例如,我们要添加一个Button:
private void Window_ContentRendered(object sender, EventArgs e)
{
MessageBox.Show("ContentRendered: " + SampleLabel.Width.ToString());
Button b1 = new Button();
b1.Content = "ContentRendered Button";
RootGrid.Children.Add(b1);
b1.Height = 25;
b1.Width = 200;
b1.HorizontalAlignment = HorizontalAlignment.Right;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
MessageBox.Show("Loaded: " + SampleLabel.Width.ToString());
Button b1 = new Button();
b1.Content = "Loaded Button";
RootGrid.Children.Add(b1);
b1.Height = 25;
b1.Width = 200;
b1.HorizontalAlignment = HorizontalAlignment.Left;
}
在Loaded 事件的情况下,Button 在Window 出现时立即添加到Grid。在ContentRendered 事件的情况下,Button 添加到Grid 之后,其所有内容都会出现。
因此,如果您想在加载 Window 之前添加项目或更改,您必须使用 Loaded 事件。如果要进行与Window 的内容相关的操作,例如截图,则需要使用事件ContentRendered。