Ancora salendo la ripida montagna WPF, e la sofferenza.
Ho definito un UserControl e la mia MainWindow ha bisogno di recuperare MouseButtonEventArgs proveniente da un controllo all'interno di UserControl (come il mouse e.GetPosition per esempio)
Nel codice UserControl dietro, ho fatto le Registrazioni e ho sollevato l'evento spumeggiante.
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 ));
}
Ora nella mia MainWindow dichiaro l'UserControl in questo modo:
<local:MyUserControl MouseDown="MyUserControl_MouseDown"/>
E questo codice dietro
private void MyUserControl_MouseDown(object sender, RoutedEventArgs e)
E ricevo gli eventi da UserControl, ma gli argomenti sono RoutedEventArgs (che è normale) ma non ho accesso a MouseButtonEventArgs che mi serve per ottenere il mouse e.GetPosition.
Quale soluzione elegante suggeriresti in questo caso?
risposte:
1 per risposta № 1Perché definisci il tuo MouseDown
evento mentre UserControl
ha già un normale evento MouseDown?
Ad ogni modo, se si definisce un evento per utilizzare a RoutedEventHandler
non sorprende che finirai per rimanere bloccato con a RoutedEventHandler
. L'hai dichiarato così:
public static readonly RoutedEvent MyButtonDownEvent = EventManager.RegisterRoutedEvent("MyMouseButtonDown", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
Si noti il bit dove si dice typeof(RoutedEventHandler)
?
Se non sbaglio, il tuo codice dovrebbe apparire come questo:
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); }
}
Esempio di come propagare un evento MouseDown esistente all'evento personalizzato:
InitializeComponent();
this.MouseDown += (s, e) => {
RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton)
{
RoutedEvent = MyButtonDownEvent
});
};
0 per risposta № 2
Penso di averlo finalmente capito (almeno spero):
Se scrivo nel codice sottostante:
public event EventHandler<MouseButtonEventArgs> MyRightButtonDownHandler;
public void MyRightButtonDown(object sender, MouseButtonEventArgs e) {
MyRightButtonDownHandler(sender, e);
}
Quindi nel consumer (MainWindow) XAML:
<local:GlobalDb x:Name="globalDb" MyRightButtonDownHandler="globalDb_MyRightButtonDownHandler"/>
E nel codice del consumatore dietro:
private void globalDb_MyRightButtonDownHandler(object sender, MouseButtonEventArgs e) {
Console.WriteLine("x= " + e.GetPosition(null).X + " y= " + e.GetPosition(null).Y);
}
Per favore dimmi se hai una soluzione migliore (secondo la politica di progettazione - regole stabilite dove lavoro - tutta la gestione degli eventi della mia applicazione DEVE apparire in XAML).
Grazie ancora per il vostro aiuto,