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

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

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

Window.ContentRenderedイベントの説明ここただ言う

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

Window.Loadedイベントの説明ここ言う

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

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

編集:

探していたものを見つけたと思いますが、さらに混乱しています。Loadedイベントが最初に発生し、その後にContentRenderedイベントが発生します。Chris SellsとIan Griffithsの著書「Programming WPF」では、イベントLoaded

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

'ContentRendered`イベントは

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

これは、イベントに関する MSDN ドキュメントの内容と矛盾していますLoaded

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

今ではさらに混乱を招いています。

ベストアンサー1

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追加します。 イベントの場合は、その内容がすべて出現した後に に追加します。GridWindowContentRenderedButtonGrid

したがって、ロード前にアイテムを追加したり変更したりする場合は、イベントWindowを使用する必要があります。スクリーンショットを撮るなどLoaded、コンテンツに関連付けられた操作を実行する場合は、Windowイベントを使用する必要がありますContentRendered

おすすめ記事