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 № 1Dlaczego 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,