WPFのWindow.Loaded
イベントとWindow.ContentRendered
イベントの違いは何ですか? ContentRendered
イベントが最初に呼び出されますか?
Window.ContentRendered
イベントの説明 here
ウィンドウのコンテンツがレンダリングされた後に発生します。
Window.Loaded
イベントの説明 here は
要素がレイアウトされ、レンダリングされ、インタラクションの準備ができたときに発生します。
ウィンドウのMaxHeight
を、ウィンドウを表示している画面の作業領域の高さに設定したい場合があります。どのイベントでそれを行うべきですか?
編集:
私が探していたものを見つけたと思うが、今はもっと混乱している。 Loaded
イベントが最初に発生し、次にContentRendered
イベントが発生します。クリス・セルズ&イアン・グリフィスによるプログラミングWPFの本では、Loaded
イベントは
ウィンドウが表示される直前に発生
'ContentRendered`イベントは
ウィンドウのコンテンツが視覚的にレンダリングされるときに発生します。
これは、MSDNドキュメントがLoaded
イベントについて述べていることと矛盾しています。
要素がレイアウトされ、レンダリングされ、インタラクションの準備ができたときに発生します。
これは今ではさらに混乱しています。
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
を使用する必要があります。
このリンクにアクセスすると https://msdn.Microsoft.com/library/ms748948%28v=vs.100%29.aspx#Window_Lifetime_Events にスクロールし、Window Lifetime Eventsにイベントを表示します注文。
開いた:
閉じる:
データバインディングを使用している場合は、ContentRenderedイベントを使用する必要があります。
以下のコードでは、Loadedイベントが発生したとき、ヘッダーはNULLです。ただし、ContentRenderedイベントが発生すると、ヘッダーの値が取得されます。
<MenuItem Header="{Binding NewGame_Name}" Command="{Binding NewGameCommand}" />