Ho trovato un sacco di esempi che spiegano il bubbling ma nessuno su Tunneling riguarda Tunneling, ad esempio, da genitore a figlio. Penso che il mio problema principale sia che non capisco come registrare l'evento indirizzato nel child (da WindowControl a UserControl). ho ottenuto:RoutedEvent Tunnel non raggiunge il bambino
public partial class MyParent : UserControl
{
public static readonly RoutedEvent RoutedMouseUpEvent = EventManager.RegisterRoutedEvent(
"PreviewMouseLeftButtonUp", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(WindowControl));
// Provide CLR accessors for the event
public event RoutedEventHandler MouseUp
{
add { AddHandler(RoutedMouseUpEvent, value); }
remove { RemoveHandler(RoutedMouseUpEvent, value); }
}
public addView(UserControl view)
{
WindowControl win = new WindowControl();
win.Content = view;
}
private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(MyParent.RoutedMouseUpEvent);
RaiseEvent(newEventArgs);
}
}
L'incapsulamento di addView è necessario, dovrebbe essere un problema? Il bambino viene aggiunto tramite addView. Viene chiamato Grid_MouseLeftButtonUp.
Il ricevitore si presenta così (è MVVM quindi non c'è molto):
public partial class ChildView : UserControl
{
void UserControl_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs args)
{
int i = 0; // The breakpoint is never called
}
}
in XAML
<Grid>
<Border BorderBrush="black" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" PreviewMouseLeftButtonUp="UserControl_PreviewMouseLeftButtonUp">
</Border>
</Grid>
Se ho dimenticato qualcosa fatemelo sapere. Il problema è che l'evento indirizzato non raggiunge UserControl_PreviewMouseLeftButtonUp
Non capisco. Perché non posso semplicemente dire al programma che MyParent è la radice? – Martin
Ora capisco. Il tunnelling non può raggiungere mio figlio, il che lo rende del tutto inutile secondo me. Ho letto quei moli ma in qualche modo non l'ho capito in questo modo. Risolverò il mio problema usando le interfacce e semplicemente passando i dati (questo era il piano B). Grazie per la spiegazione eccellente. – Martin
Il tunnelling non è inutile, è semplicemente usato per un compito diverso da quello che stai tentando. Ad esempio, potrebbe essere utilizzato per impedire la digitazione di determinati caratteri in un TextBox catturando le pressioni dei tasti e annullando l'evento prima che raggiunga il TextBox. –