web-dev-qa-db-ja.com

Window.LoadedイベントとWindow.ContentRenderedイベントの違いは何ですか

WPFのWindow.LoadedイベントとWindow.ContentRenderedイベントの違いは何ですか? ContentRenderedイベントが最初に呼び出されますか?

Window.ContentRenderedイベントの説明 here

ウィンドウのコンテンツがレンダリングされた後に発生します。

Window.Loadedイベントの説明 here

要素がレイアウトされ、レンダリングされ、インタラクションの準備ができたときに発生します。

ウィンドウのMaxHeightを、ウィンドウを表示している画面の作業領域の高さに設定したい場合があります。どのイベントでそれを行うべきですか?

編集:

私が探していたものを見つけたと思うが、今はもっと混乱している。 Loadedイベントが最初に発生し、次にContentRenderedイベントが発生します。クリス・セルズ&イアン・グリフィスによるプログラミングWPFの本では、Loadedイベントは

ウィンドウが表示される直前に発生

'ContentRendered`イベントは

ウィンドウのコンテンツが視覚的にレンダリングされるときに発生します。

これは、MSDNドキュメントがLoadedイベントについて述べていることと矛盾しています。

要素がレイアウトされ、レンダリングされ、インタラクションの準備ができたときに発生します。

これは今ではさらに混乱しています。

51
Tony Vitabile

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のメインGridWindowを作成しましょう。どちらの場合も、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());
}   

StylesTemplatesに関しては、この段階でそれらは正常に適用され、これらのイベントでそれらにアクセスできるようになります。

たとえば、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を使用する必要があります。

52

このリンクにアクセスすると https://msdn.Microsoft.com/library/ms748948%28v=vs.100%29.aspx#Window_Lifetime_Events にスクロールし、Window Lifetime Eventsにイベントを表示します注文。

開いた:

  1. SourceInitiated
  2. 有効化
  3. ロード済み
  4. ContentRendered

閉じる:

  1. 閉鎖
  2. 無効化
  3. 閉まっている
42
sa_ddam213

データバインディングを使用している場合は、ContentRenderedイベントを使用する必要があります。

以下のコードでは、Loadedイベントが発生したとき、ヘッダーはNULLです。ただし、ContentRenderedイベントが発生すると、ヘッダーの値が取得されます。

<MenuItem Header="{Binding NewGame_Name}" Command="{Binding NewGameCommand}" />
10
Trevy Burgess