wpf routed Was ist der Unterschied zwischen den Ereignissen Window.Loaded und Window.ContentRendered?




wpf window loaded event (3)

Was ist der Unterschied zwischen den Ereignissen Window.Loaded und Window.ContentRendered in WPF? Wird das ContentRendered Ereignis zuerst aufgerufen?

Die Beschreibung des Window.ContentRendered Ereignisses here sagt nur

Tritt auf, nachdem der Inhalt eines Fensters gerendert wurde.

Die Beschreibung des Window.Loaded Ereignisses here sagt

Tritt auf, wenn das Element ausgelegt, gerendert und zur Interaktion bereit ist.

Ich habe einen Fall, in dem ich die MaxHeight des Fensters auf die Höhe des Arbeitsbereichs des Bildschirms einstellen MaxHeight , der mein Fenster anzeigt. In welchem ​​Event soll ich es machen?

Bearbeiten:

Ich glaube, ich habe gefunden, wonach ich gesucht habe, aber jetzt bin ich noch verwirrter. Das Loaded Ereignis tritt zuerst auf und dann tritt das ContentRendered Ereignis auf. In dem Buch Programming WPF von Chris Sells & Ian Griffiths steht, dass das Loaded Event ist

Wird ausgelöst, kurz bevor das Fenster angezeigt wird

Während das "ContentRendered" -Ereignis ist

Wird ausgelöst, wenn der Inhalt des Fensters visuell wiedergegeben wird.

Das widerspricht dem, was die MSDN-Dokumentation über das Loaded Ereignis sagt:

Tritt auf, wenn das Element ausgelegt, gerendert und zur Interaktion bereit ist.

Dies ist jetzt noch verwirrender.



Ich denke, es gibt wenig Unterschied zwischen den beiden Ereignissen. Um dies zu verstehen, habe ich ein einfaches Beispiel für die Manipulation erstellt:

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");
}   

In diesem Fall erscheint die Nachricht Loaded als erstes nach der Nachricht ContentRendered . Dies bestätigt die Informationen in der Dokumentation.

Im Allgemeinen wird in WPF das Loaded Ereignis ausgelöst, wenn das Element:

ist angelegt, gerendert und bereit für die Interaktion.

Da in WPF das Window das gleiche Element ist, sollte es aber im Allgemeinen Inhalt sein, der in einem Root-Panel angeordnet ist (zum Beispiel: Grid ). Daher, um den Inhalt des Window zu überwachen und ein ContentRendered Ereignis erstellt. Anmerkungen von MSDN:

Wenn das Fenster keinen Inhalt enthält, wird dieses Ereignis nicht ausgelöst.

Das heißt, wenn wir ein Window erstellen:

<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" />

Es funktioniert nur Loaded Event.

Hinsichtlich des Zugriffs auf die Elemente im Window funktionieren sie auf die gleiche Weise. Lassen Sie uns ein Label im Grid von Window erstellen. In beiden Fällen haben wir erfolgreich Zugriff auf 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());
}   

Was die Styles und Templates , werden sie in diesem Stadium erfolgreich angewendet und in diesen Fällen können wir darauf zugreifen.

Zum Beispiel möchten wir einen Button hinzufügen:

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;
}

Im Falle des Loaded Ereignisses, Button , die sofort beim Erscheinen des Window zum Grid hinzugefügt wird. Im Falle eines ContentRendered Ereignisses wird der Button zum Hinzufügen zum Grid nach seinem gesamten Inhalt ContentRendered .

Wenn Sie Elemente oder Änderungen vor dem Laden des Window hinzufügen möchten, müssen Sie daher das Loaded Ereignis verwenden. Wenn Sie die Vorgänge ausführen möchten, die mit dem Inhalt von Window verknüpft sind, wie das ContentRendered Screenshots, müssen Sie das Ereignis ContentRendered .


Wenn Sie Datenbindung verwenden, müssen Sie das ContentRendered-Ereignis verwenden.

Für den folgenden Code ist der Header NULL, wenn das Loaded-Ereignis ausgelöst wird. Header erhält jedoch seinen Wert, wenn das ContentRendered-Ereignis ausgelöst wird.

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




window