wpf events window

wpf - ¿Cuál es la diferencia entre los eventos Window.Loaded y Window.ContentRendered?



events (3)

Creo que hay poca diferencia entre los dos eventos. Para entender esto, creé un ejemplo simple para la manipulación:

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

En este caso, el mensaje Loaded aparece primero después del mensaje ContentRendered . Esto confirma la información en la documentación.

En general, en WPF, el evento Loaded se desencadena si el elemento:

está diseñado, renderizado y listo para la interacción.

Dado que en WPF, la Window es el mismo elemento, pero generalmente debe ser contenido que se organiza en un panel raíz (por ejemplo: Grid ). Por lo tanto, para supervisar el contenido de la Window y creó un evento ContentRendered . Comentarios de MSDN:

Si la ventana no tiene contenido, este evento no se genera.

Es decir, si creamos una 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" />

Solo funcionará el evento Loaded .

Con respecto al acceso a los elementos en la Window , funcionan de la misma manera. Vamos a crear una Label en la Grid de Window . En ambos casos, hemos recibido acceso exitoso a 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()); }

En cuanto a los Styles y Templates , en esta etapa se aplican con éxito, y en estos eventos podremos acceder a ellos.

Por ejemplo, queremos agregar un 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; }

En el caso del evento Loaded , Button para agregar a la Grid inmediatamente en la apariencia de la Window . En el caso del evento ContentRendered , Button para agregar a la Grid después de que aparezca todo su contenido.

Por lo tanto, si desea agregar elementos o cambios antes de cargar Window , debe usar el evento Loaded . Si desea realizar las operaciones asociadas con el contenido de la Window , como tomar capturas de pantalla, deberá usar un evento ContentRendered .

¿Cuál es la diferencia entre los eventos Window.Loaded y Window.ContentRendered en WPF? ¿ ContentRendered evento ContentRendered se llama primero?

La descripción del evento Window.ContentRendered here solo dice

Se produce después de que se haya procesado el contenido de una ventana.

La descripción del evento Window.Loaded here dice

Se produce cuando el elemento se presenta, se procesa y está listo para la interacción.

Tengo un caso en el que quiero establecer MaxHeight la ventana a la altura del área de trabajo de la pantalla que muestra mi ventana. ¿En qué evento debo hacerlo?

Editar:

Creo que encontré lo que estaba buscando, pero ahora estoy aún más confundido. El evento Loaded ocurre primero y luego ocurre el evento ContentRendered . En el libro Programming WPF de Chris Sells & Ian Griffiths, dice que el evento Loaded es

Criado justo antes de que se muestre la ventana

Mientras que el evento ''ContentRendered` es

Se genera cuando el contenido de la ventana se representa visualmente.

Esto contradice lo que dice la documentación de MSDN sobre el evento Loaded :

Se produce cuando el elemento se presenta, se procesa y está listo para la interacción.

Esto es aún más confuso ahora.


Si usa el enlace de datos, entonces necesita usar el evento ContentRendered.

Para el código siguiente, el encabezado es NULL cuando se genera el evento cargado. Sin embargo, el encabezado obtiene su valor cuando se genera el evento ContentRendered.

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