2008-10-10 5 views
5

Ich habe eine sehr einfache WPF Usercontrol bekam die wie folgt aussieht:Initialized Ereignis von WPF Usercontrol dem Brennen nicht

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

ich dann verwenden, in der XAML eines Standard-WPF-Fenster wie folgt aus:

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

mit dem Code hinter der oben WPF-Fenster sieht wie folgt aus:

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

Leider ist das Initialized Ereignis ist neve r gefeuert. Kann mir bitte jemand sagen warum?

Vielen Dank!

Antwort

13

Die MSDN doc sagt

Dieses Ereignis wird ausgelöst wird, sobald die EndInit oder OnVisualParentChanged Methoden aufgerufen werden. Aufrufe an das -Verfahren könnten von Anwendungscode stammen oder über das Extensible Application Markup Language-Prozessorverhalten (XAML), wenn eine XAML -Seite verarbeitet wird.

Ich kann Ihr Problem hier reproduzieren. Ich würde stattdessen das Ereignis Loaded empfehlen, das ausgelöst wird, nachdem das Steuerelement ausgelegt und gerendert wurde. Wenn Sie wirklich das Initialized Ereignis benötigen, befolgen Sie die Ratschläge dieses MSDN Forum thread und eine Event-Handler im Konstruktor des UserControl an, bevor InitializeComponent() wie dieser Aufruf:

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

Für eine detailliertere Erklärung von Loaded vs. Initialized finden this blog posting.

+0

Danke David. Würden Sie das als WPF-Defekt betrachten? –

+2

Nein, ich lese die Dokumente gründlicher, ich kann sehen, dass dies wie angekündigt funktioniert. –