2012-11-20 13 views
5

私はバブリングについて多くの例を見つけましたが、トンネリングについてはこれはトンネルに関するものです。例えば、親から子へ。私の主な問題は、私はどのように子に(WindowControlをUserControlに)ルーティングされたイベントを登録するのか分からないと思います。 私が得た:RoutedEventトンネルが子に届かない

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

addViewのカプセル化が必要であるが、問題はないはず?子はaddView経由で追加されます。 Grid_MouseLeftButtonUpが呼び出されました。
受信機は、この(多くはありませんので、それがMVVMである)のようになります。私は私に教えてください何かを忘れてしまった場合は、XAML

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

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

。 問題は、ルーテッドイベントがUserControl_PreviewMouseLeftButtonUpに届かないということです。

答えて

11

これは、トンネリングルーティング戦略の仕組みではありません。トンネリングとは、イベントがルートから開始し、ツリーパスを呼び出しコントロールに移動することを意味します。例えば、我々は

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

その後、MyParentはトンネリングイベントを発生させます場合は、次のビジュアルツリーを持っている場合、トンネリングイベントが訪れます:

  1. ウィンドウ
  2. MyParent

をNOT

  1. MyParent
  2. ChildView

だから要約し、バブリングイベントは、常にイベントを発生させる制御で始まり、トンネリングイベントは、ビジュアルのルートから開始しますが、ビジュアルツリーのルートで停止イベントを発生させるコントロールで終了します(まったく同じパス、逆順のみ)。

EDIT:ルーティングされたイベントの詳細については、MSDN's Routed Events Overviewを参照してください。私は理解していない

enter image description here

+0

:それはまた、これを証明する素敵なイメージを持っています。なぜMyParentがルートであることをプログラムに伝えることができないのですか? – Martin

+1

これで分かりました。トンネリングは私の子供に届くことができません。私はそれらのドックを読んだが、何とかこのように理解していなかった。私はInterfacesを使って問題を解決し、単にデータを渡します(これは計画Bでした)。優秀な説明をありがとう。 – Martin

+1

トンネリングは役に立たないわけではありません。単に、試みているタスクとは異なるタスクに使用されています。たとえば、キー押下をキャプチャしてTextBoxに到達する前にイベントをキャンセルすることによって、TextBoxの特定の文字の入力を禁止することができます。 –

関連する問題