2008-10-10 5 views
5

J'ai un WPF très simple UserControl qui ressemble à ceci:événement Initialized de WPF UserControl pas de tir

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

J'utilise ensuite dans le XAML d'une fenêtre standard WPF comme ceci:

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

avec le code derrière de la fenêtre ressemble WPF ci-dessus ceci:

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

Malheureusement, l'événement Initialized est neve r tiré. Quelqu'un peut-il me dire pourquoi?

Merci beaucoup!

Répondre

13

Le MSDN doc dit

Cet événement sera relevé chaque fois que le EndInit ou OnVisualParentChanged méthodes sont appelées. Les appels à la méthode peuvent provenir du code de l'application ou du comportement du processeur Extensible Application Markup Language (XAML) lorsqu'une page XAML est traitée.

Je peux reproduire votre problème ici. Je recommande à la place d'utiliser l'événement Loaded, qui est déclenché après que le contrôle a été défini et rendu. Si vous avez vraiment besoin de l'événement Initialized, suivez les conseils de ce MSDN Forum thread et joindre un gestionnaire d'événements dans le constructeur de l'UserControl avant d'appeler InitializeComponent() comme ceci:

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

Pour une explication plus détaillée de Loaded contre Initialized, voir this blog posting.

+0

Merci David. Considérez-vous cela comme un défaut de WPF? –

+2

Non, en lisant les docs de plus près, je peux voir que cela fonctionne comme annoncé. –

Questions connexes