#.net #wpf #.net-3.5
Вопрос:
У меня есть очень простой пользовательский элемент управления 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);
}
}
}
Затем я использую его в XAML стандартного окна WPF, как это:
<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!");
}
К сожалению, Инициализированное событие никогда не запускается. Кто-нибудь может, пожалуйста, сказать мне, почему?
Большое спасибо!
Ответ №1:
В документе MSDN говорится
Это событие будет возникать всякий раз, когда вызываются методы EndInit или OnVisualParentChanged. Вызовы любого из методов могли исходить из кода приложения или из поведения процессора Расширяемого языка разметки приложений (XAML) при обработке страницы XAML.
Я могу воспроизвести вашу проблему здесь. Я бы рекомендовал Loaded
вместо этого использовать событие, которое запускается после того, как элемент управления выложен и визуализирован. Если вам действительно нужно Initialized
событие, следуйте советам этой темы форума MSDN и прикрепите обработчик событий в конструкторе UserControl
перед вызовом InitializeComponent()
, как это:
public UserControl1()
{
this.Initialized = delegate
{
MessageBox.Show("Hello!");
};
InitializeComponent();
}
Для более подробного объяснения Loaded
Initialized
этого см. Эту запись в блоге.
Комментарии:
1. Спасибо, Дэвид. Считаете ли вы это дефектом WPF?
2. Нет, прочитав документы более внимательно, я вижу, что это работает так, как рекламируется.