Инициализированное событие WPF UserControl не запускается - PullRequest
5 голосов
/ 10 октября 2008

У меня есть очень простой WPF UserControl, который выглядит так:

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

К сожалению, событие Initialized никогда не запускается. Кто-нибудь может сказать, пожалуйста, почему?

Большое спасибо!

1 Ответ

13 голосов
/ 10 октября 2008

Документ MSDN говорит

Это событие будет вызываться всякий раз, когда EndInit или OnVisualParentChanged методы называются. Звонки либо метод мог прийти из код приложения или через Расширяемый язык разметки приложений (XAML) поведение процессора при использовании XAML страница обработана.

Я могу воспроизвести вашу проблему здесь. Я бы рекомендовал вместо этого использовать событие Loaded, которое запускается после того, как элемент управления выложен и обработан. Если вам действительно нужно событие Initialized, следуйте советам этого ветки форума MSDN и присоедините обработчик событий в конструкторе UserControl перед вызовом InitializeComponent() следующим образом:

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

Более подробное объяснение Loaded против Initialized см. в этом блоге .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...