2008-10-10 19 views
5

Tengo una muy simple WPF control de usuario que tiene este aspecto:evento inicializado del control de usuario de WPF no disparar

namespace MyUserControl 
{ 
    /// <summary> 
    /// Interaction logic for UserControl1.xaml 
    /// </summary> 
    public partial class UserControl1 : UserControl 
    { 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnRender(DrawingContext drawingContext) 
    { 
     Rect rect = new Rect(RenderSize); 
     drawingContext.DrawRectangle(Brushes.AliceBlue, new Pen(Brushes.Red, 1), rect); 
     base.OnRender(drawingContext); 
    } 
    } 
} 

entonces lo uso en el XAML de una ventana estándar de WPF como esto:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="clr-namespace:MyUserControl;assembly=MyUserControl" 
    Title="Window1" Height="351" Width="496"> 
    <Grid> 
    <mc:UserControl1 Margin="0,0,0,0" Name="uControl1" Initialized="uControl1_Initialized"/> 
    </Grid> 
</Window> 

con el código detrás de la ventana de WPF citadas es el siguiente:

private void uControl1_Initialized(object sender, EventArgs e) 
{ 
    MessageBox.Show("Hello!"); 
} 

Desafortunadamente el evento es inicializado Neve r despedido. ¿Alguien puede decirme por qué?

¡Muchas gracias!

Respuesta

13

El MSDN doc dice

Este evento se desencadena cuando el EndInit o OnVisualParentChanged se llaman métodos. Las llamadas al método podrían proceder del código de aplicación o del comportamiento del procesador de lenguaje de marcado extensible de aplicaciones (XAML) cuando se procesa una página XAML .

Puedo reproducir su problema aquí. Yo recomendaría utilizar el evento Loaded en su lugar, que se activa después de que se haya diseñado y procesado el control. Si realmente necesita el evento Initialized, seguir los consejos de este MSDN Forum thread y conectar un controlador de eventos en el constructor de la UserControl antes de llamar InitializeComponent() así:

public UserControl1() 
{ 
    this.Initialized += delegate 
    { 
     MessageBox.Show("Hello!"); 
    }; 
    InitializeComponent(); 
} 

Para una explicación más detallada de Loaded vs Initialized, véase this blog posting.

+0

Gracias David. ¿Considerarías esto un defecto de WPF? –

+2

No, leyendo los documentos más a fondo, puedo ver que esto funciona como se anuncia. –

Cuestiones relacionadas