2008-10-10 152 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