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}" />
Si visita este enlace https://msdn.microsoft.com/library/ms748948%28v=vs.100%29.aspx#Window_Lifetime_Events y desplácese hacia abajo a Window Lifetime Events, le mostrará el orden del evento.
Abierto:
- SourceInitiated
- Activado
- Cargado
- ContentRendered
Cerca:
- Clausura
- Desactivado
- Cerrado