/ / Czy ktoś może podnieść dowolny RoutedEvent w WPF? - c #, .net, wpf, zdarzenia routowane

Czy każdy może podnieść dowolny RoutedEvent w WPF? - c #, .net, wpf, zdarzenia routowane

W wydarzeniach C # zawsze były bardzo chronione: Tylko właściciel zdarzenia może je uruchomić. Jednak w WPF wygląda to zupełnie inaczej - każdy może rzucić dowolne wydarzenie w dowolnym czasie. Aby to przetestować, napisałem kod na dole.

Kiedy użyłem RaiseEvent do podniesienia przycisku.Kliknij, zdarzenie powyżej go złapało. Czy to jest zaplanowane zachowanie wydarzeń WPF? Po prostu pozwolić komukolwiek rzucać dowolnymi zdarzeniami? Ponadto, jeśli tak, to jakie jest znaczenie właściwości OwnerType podczas rejestracji wydarzenia? Myślałem, że jest to pewnego rodzaju ochrona, ale jeśli tak, to jest kiepska, ponieważ każdy może uzyskać dostęp do wydarzenia publicznego i użyć funkcji AddOwner, aby dodać więcej właścicieli.

Dzięki!

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>

Kod z tyłu

Kontrola niestandardowa:

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

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

I przewodnik:

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

Odpowiedzi:

3 dla odpowiedzi № 1

Jest to zgodne z projektem i jest faktycznie jednym z nichpowody dla RoutedEvents. Nazywane są zdarzeniami routowanymi, ponieważ są kierowane przez drzewo elementów. Zachowanie, którego doświadczasz, nazywa się "pojedynczym punktem przyłączenia obsługi" msdn. Określasz, że StackPanel powinien nasłuchiwać wszystkich zdarzeń Button.Click.

W formancie niestandardowym podnosisz zdarzenie click button. To "bąbelkuje" aż do panelu sterującego, który go obsługuje.

AKTUALIZACJA:

Aby to routing działał, ja założyć każdy UIElement musi być w stanie podnieść dowolne wydarzenie routowane. Zdarzenia routowane są używane tylko przez elementy interfejsu użytkownika i stanowią odpowiedź na złożoność implementacji WinForm. Nie zastępują zdarzeń CLR. Typ właściciela jest używany wewnętrznie przy rozwiązywaniu wydarzenia według nazwy.