2012-11-20 11 views
5

Ich fand eine Menge Beispiel zu erklären, sprudelnd aber nichts über Tunneling geht es um Tunneling zB Eltern zu Kind. Ich denke, mein Hauptproblem ist, dass ich nicht verstehe, wie das Routingereignis im Kind (WindowControl zu UserControl) registriert wird. Ich habe:RoutedEvent Tunnel erreicht Kind nicht

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); 
} 
} 

Die Verkapselung von addView notwendig ist, sollte kein Problem sein? Das Kind wird über addView hinzugefügt. Grid_MouseLeftButtonUp wird aufgerufen.
Der Empfänger sieht wie folgt aus (Es ist mvvm so gibt es nicht viel):

public partial class ChildView : UserControl 
{ 
void UserControl_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs args) 
{ 
    int i = 0; // The breakpoint is never called 
} 
} 

in der XAML

<Grid> 
    <Border BorderBrush="black" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" PreviewMouseLeftButtonUp="UserControl_PreviewMouseLeftButtonUp"> 
</Border> 
</Grid> 

Wenn ich etwas vergessen haben, lassen Sie es mich wissen. Das Problem ist, dass das Routingereignis nicht UserControl_PreviewMouseLeftButtonUp

Antwort

11

erreicht Dies ist nicht wie Tunnel Routing-Strategie funktioniert. Tunneling bedeutet, dass das Ereignis vom Root gestartet wird und den Baumpfad zum aufrufenden Steuerelement durchläuft. Zum Beispiel, wenn wir die folgenden visuelle Struktur

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

dann, wenn MyParent ein Tunnel-Ereignis auslösen wird, wird die Tunnel Veranstaltung besuchen:

  1. Fenster
  2. MyParent

und NICHT

  1. MyParent
  2. ChildView

So zusammenzufassen, wird sprudeln Ereignisse immer an der Steuerung starten Sie das Ereignis und stoppen an der Wurzel der visuellen Struktur erhöht, während Tunnelereignissen an der Wurzel des visuellen starten Baum und Ende an der Kontrolle, die das Ereignis anhebt (genau gleicher Pfad, nur umgekehrte Reihenfolge).

EDIT: Sie können mehr über Routing-Ereignisse in MSDN's Routed Events Overview lesen. Es hat auch ein schönes Bild demonstriert dies:

enter image description here

+0

Ich verstehe nicht. Warum kann ich dem Programm nicht einfach sagen, dass MyParent die Wurzel ist? – Martin

+1

Jetzt verstehe ich. Tunneling kann mein Kind nicht erreichen, was meiner Meinung nach ziemlich nutzlos ist. Ich habe diese Docks gelesen, aber irgendwie habe ich das nicht verstanden. Ich werde mein Problem mit Interfaces lösen und einfach Daten weitergeben (das war Plan B). Danke für die hervorragende Erklärung. – Martin

+1

Tunneling ist nicht nutzlos, es wird einfach für eine andere Aufgabe als die, die Sie versuchen, verwendet. Zum Beispiel könnte es verwendet werden, um das Eingeben bestimmter Zeichen in eine TextBox zu verbieten, indem Tastenbetätigungen erfasst und das Ereignis abgebrochen wird, bevor es die TextBox erreicht. –