2008-10-10 34 views
5

Tôi đã có một WPF UserControl rất đơn giản mà trông như thế này:kiện Initialized của WPF UserControl không bắn

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

sau đó tôi sử dụng nó trong XAML của một cửa sổ WPF tiêu chuẩn như thế này:

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

với mã đằng sau các cửa sổ WPF trên trông như thế này:

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

Đáng tiếc là sự kiện khởi tạo là neve r bắn. Ai có thể vui lòng cho tôi biết tại sao?

Rất cám ơn!

Trả lời

13

Các MSDN doc nói

Sự kiện này sẽ được nâng lên bất cứ khi nào EndInit hoặc OnVisualParentChanged phương pháp này được gọi là. Các cuộc gọi đến phương thức có thể đến từ mã số ứng dụng hoặc thông qua Ngôn ngữ đánh dấu ứng dụng có thể mở rộng (XAML) khi một trang XAML được xử lý.

Tôi có thể tạo lại sự cố của bạn tại đây. Tôi khuyên bạn nên sử dụng sự kiện Loaded thay vì được kích hoạt sau khi điều khiển được đặt ra và hiển thị. Nếu bạn thực sự cần sự kiện Initialized, hãy làm theo những lời khuyên của MSDN Forum thread này và đính kèm một xử lý sự kiện trong constructor của UserControl trước khi gọi InitializeComponent() như thế này:

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

Đối với một lời giải thích chi tiết hơn về Loaded vs Initialized, xem this blog posting.

+0

Cảm ơn David. Bạn có coi đây là lỗi WPF không? –

+2

Không, đọc tài liệu kỹ lưỡng hơn, tôi có thể thấy điều này hoạt động như được quảng cáo. –

Các vấn đề liên quan