60

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

ここWindow.ContentRenderedでのイベントの説明はちょうど言う

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

ここWindow.Loadedでのイベントの説明は次のように述べています

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

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

編集:

探していたものを見つけたと思いますが、今はさらに混乱しています。Loadedイベントが最初に発生し、次にイベントContentRenderedが発生します。Chris Sells & Ian Griffiths による本 Programming WPF では、Loadedイベントは

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

「ContentRendered」イベントが

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

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

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

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

4

4 に答える 4

65

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、コンテンツに関連する操作を行う場合は、イベントを使用する必要があります。WindowContentRendered

于 2013-08-27T06:02:00.577 に答える
49

このリンクhttps://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms748948(v=vs.100)#window-lifetime-eventsにアクセスし、[ウィンドウ ライフタイム イベント] までスクロールします。イベントの順番が表示されます。

開ける:

  1. SourceInitiated
  2. アクティブ化
  3. ロード済み
  4. レンダリングされたコンテンツ

近い:

  1. 閉鎖
  2. 非活動化
  3. 閉まっている
于 2013-08-26T21:26:56.570 に答える