2つのイベントの違いはほとんどないと思います。これを理解するために、操作の簡単な例を作成しました。
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
、同じように機能します。Label
のメインGrid
に を作成しましょうWindow
。どちらの場合も、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
に追加します。イベントの場合は、その内容がすべて表示された後に追加します。Grid
Window
ContentRendered
Button
Grid
したがって、ロード前にアイテムまたは変更を追加する場合は、イベントWindow
を使用する必要があります。スクリーンショットの撮影などLoaded
、コンテンツに関連する操作を行う場合は、イベントを使用する必要があります。Window
ContentRendered