/ / Podczas podnoszenia MouseButtonEvent z UserControl MainWindow nie ma dostępu do MouseButtonEventArgs - wpf, zdarzeń, kontroli użytkowników, propagacji zdarzeń

Podczas podnoszenia MouseButtonEvent z UserControl MainWindow nie ma dostępu do MouseButtonEventArgs - wpf, zdarzeń, kontroli użytkownika, propagacji zdarzeń

Wciąż wspinamy się na stromą górę WPF i cierpimy.

Zdefiniowałem UserControl, a mój MainWindow musi pobrać MouseButtonEventArgs pochodzący z kontrolki wewnątrz UserControl (na przykład myszki e.GetPosition)

W kodzie UserControl, zrobiłem Rejestracje i Podnoszę bulgotanie.

public static readonly RoutedEvent MyButtonDownEvent = EventManager.RegisterRoutedEvent("MyMouseButtonDown", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
public event RoutedEventHandler MyButtonDown {
add { AddHandler(MyButtonDownEvent, value); }
remove { RemoveHandler(MyButtonDownEvent, value); }
}
private void MyMouseButtonDownHandler(object sender, MouseButtonEventArgs e) {
RaiseEvent(new RoutedEventArgs(MyButtonDownEvent ));
}

Teraz w moim MainWindow deklaruję UserControl w następujący sposób:

<local:MyUserControl MouseDown="MyUserControl_MouseDown"/>

I ten kod za

private void MyUserControl_MouseDown(object sender, RoutedEventArgs e)

I otrzymuję zdarzenia od UserControl, ale Args są RoutedEventArgs (co jest normalne), ale nie mam dostępu do MouseButtonEventArgs, które potrzebuję, aby uzyskać mysz e.GetPosition.

Jakie eleganckie rozwiązanie zaproponowałbyś w tym przypadku?

Odpowiedzi:

1 dla odpowiedzi № 1

Dlaczego definiujesz swój własny MouseDown wydarzenie while UserControl już ma normalne zdarzenie MouseDown?

W każdym razie, jeśli zdefiniuj zdarzenie do użycia a RoutedEventHandler trudno się dziwić, że utkniesz z powodu RoutedEventHandler. Zadeklarowałeś to tak:

public static readonly RoutedEvent MyButtonDownEvent = EventManager.RegisterRoutedEvent("MyMouseButtonDown", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));

Zwróć uwagę na miejsce, w którym jest napisane typeof(RoutedEventHandler)?

Jeśli się nie mylę, Twój kod powinien wyglądać tak:

    public static readonly RoutedEvent MyButtonDownEvent =
EventManager.RegisterRoutedEvent
("MyButtonDown",
RoutingStrategy.Bubble,
typeof(MouseButtonEventHandler),
typeof(MyUserControl));

public event MouseButtonEventHandler MyButtonDown
{
add { AddHandler(MyButtonDownEvent, value); }
remove { RemoveHandler(MyButtonDownEvent, value); }
}

Przykład jak propagować istniejące zdarzenie MouseDown do zdarzenia niestandardowego:

InitializeComponent();
this.MouseDown += (s, e) => {
RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton)
{
RoutedEvent = MyButtonDownEvent
});
};

0 dla odpowiedzi nr 2

Myślę, że w końcu to dostałem (przynajmniej mam nadzieję):

Jeśli napiszę w kodzie za:

        public event EventHandler<MouseButtonEventArgs> MyRightButtonDownHandler;
public void MyRightButtonDown(object sender, MouseButtonEventArgs e) {
MyRightButtonDownHandler(sender, e);
}

Następnie w konsumenta (MainWindow) XAML:

<local:GlobalDb x:Name="globalDb"  MyRightButtonDownHandler="globalDb_MyRightButtonDownHandler"/>

A w kodzie konsumenta:

    private void globalDb_MyRightButtonDownHandler(object sender, MouseButtonEventArgs e) {
Console.WriteLine("x= " + e.GetPosition(null).X + " y= " + e.GetPosition(null).Y);
}

Proszę mi powiedzieć, czy masz lepsze rozwiązanie (zgodnie z polityką projektową - zasady ustalane w miejscu pracy - cała obsługa zdarzeń mojej aplikacji MUSI pojawić się w XAML).

Jeszcze raz dziękuję za pomoc,