2012-11-20 10 views
5

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

risposta

11

Non è così che funziona la strategia di routing tunneling. Tunneling significa che l'evento inizierà dalla root e scenderà lungo il percorso dell'albero fino al controllo chiamante. Per esempio, se abbiamo la seguente struttura ad albero visuale

Window 
| 
|--> SomeUserControl 
|--> MyParent 
    | 
    |--> ChildView 

allora se MyParent alzerà un evento tunneling, l'evento tunneling visiterà:

  1. Finestra
  2. mioGenitore

e NON

  1. mioGenitore
  2. ChildView

Quindi, per riassumere, eventi spumeggiante sarà sempre iniziare al controllo verifica l'anomalia e fermarsi alla radice dell'albero visiva, mentre gli eventi di tunneling inizieranno alla radice del visivo albero e termina al controllo sollevando l'evento (esattamente lo stesso percorso, solo ordine inverso).

MODIFICA: Ulteriori informazioni sugli eventi instradati sono disponibili in MSDN's Routed Events Overview. Ha anche una bella immagine che dimostrano questo:

enter image description here

+0

Non capisco. Perché non posso semplicemente dire al programma che MyParent è la radice? – Martin

+1

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

+1

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. –

Problemi correlati