2008-10-10 149 views
5

我有一个非常简单的WPF用户控件,看起来像这样:WPF用户控件的初始化事件不触发

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

然后我用它在标准WPF窗口的XAML这样的:

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

上述WPF窗口后面的代码如下所示:

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

不幸的是,初始化事件是尼夫发射。任何人都可以告诉我为什么?

非常感谢!

回答

13

MSDN doc

每当 EndInit或OnVisualParentChanged被称为 方法将这一事件引发。当处理XAML 页面时,调用 方法的方法可能来自 应用程序代码或通过可扩展应用程序标记语言 (XAML)处理器行为。

我可以在这里重现您的问题。我建议使用Loaded事件,而在控件布局和呈现后触发。如果你真的需要Initialized事件,按照这个MSDN Forum thread的建议,并呼吁InitializeComponent()这样前将在UserControl的构造事件处理程序:

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

对于LoadedInitialized更详细的说明,请参阅this blog posting

+0

谢谢大卫。你会认为这是一个WPF缺陷? – 2008-10-10 11:08:13