/ / Quando si solleva un oggetto MouseButtonEvent da un controllo utente, MainWindow non ha accesso a MouseButtonEventArgs: wpf, eventi, controlli utente, evento che bolle

Quando si solleva un oggetto MouseButtonEvent da un controllo utente, la finestra principale non ha accesso a MouseButtonEventArgs: wpf, eventi, controlli utente, evento che bolle

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

Perché 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,