Кто-нибудь может поднять любой RoutedEvent в WPF? - PullRequest
3 голосов
/ 03 февраля 2011

В C # события всегда были очень защищены: их может вызывать только владелец события.Тем не менее, в WPF это выглядит совсем по-другому - любой может бросить любое событие в любое время.Чтобы проверить это, я написал код внизу.

Когда я использовал RaiseEvent для поднятия Button.Click, событие выше поймало его.Это запланированное поведение событий WPF?Просто позволять кому-либо бросать любые события, которые они желают?Кроме того, если так, то что означает значение OwnerType при регистрации события?Я думал, что это какая-то защита, но если она есть, то она плохая, поскольку любой может получить доступ к общедоступному событию и использовать функцию AddOwner для добавления новых владельцев.

Спасибо!

XAML

<StackPanel Button.Click="ButtonBase_OnClick">
    <Button Name="RealButton">Real button</Button>
    <WpfWindow:VitalyControl MouseDown="UIElement_OnMouseDown">
      I am almost a button
    </WpfWindow:VitalyControl>
</StackPanel>

Код позади

Пользовательский элемент управления:

class VitalyControl : Label
{
    public VitalyControl()
    {
        this.MouseDown += new MouseButtonEventHandler(VitalyControl_MouseDown);
    }

    void VitalyControl_MouseDown(object sender, MouseButtonEventArgs e)
    {
        RaiseEvent(new RoutedEventArgs(Button.ClickEvent, this));
    }
}

И обработчик:

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Button was pressed");
    }

1 Ответ

3 голосов
/ 03 февраля 2011

Это сделано специально и является одной из причин RoutedEvents.Они называются перенаправленными событиями, потому что они направляются через дерево элементов.Поведение, которое вы испытываете, называется «точка подключения единственного обработчика» на msdn .Вы указываете, что StackPanel должен прослушивать все события Button.Click.

В вашем пользовательском элементе управления вы вызываете событие нажатия кнопки.Это 'пузыри' до панели стека, которая его обрабатывает.

ОБНОВЛЕНИЕ:

Чтобы эта маршрутизация работала, я предполагаю каждый UIElement потребностичтобы иметь возможность поднять любое перенаправленное событие.Маршрутизированные события используются только элементами пользовательского интерфейса и являются ответом на сложности с реализациями WinForms.Они не являются заменой для событий CLR.Тип владельца используется внутренне при разрешении события по имени .

...