5

バブリングを説明する例をたくさん見つけましたが、トンネリングについては、親から子などのトンネリングについてはありません。私の主な問題は、ルーティングされたイベントを子(WindowControlからUserControl)に登録する方法がわからないことだと思います。私が得た:

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なのであまりありません):

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

xamlで

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

何か忘れた場合はお知らせください。問題は、ルーティングされたイベントがUserControl_PreviewMouseLeftButtonUpに到達しないことです。

4

1 に答える 1

11

これは、トンネリング ルーティング戦略がどのように機能するかではありません。トンネリングとは、イベントがルートから開始し、ツリー パスを下って呼び出し元のコントロールに到達することを意味します。たとえば、次のビジュアル ツリーがあるとします。

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

がトンネリング イベントを発生させる場合MyParent、トンネリング イベントは以下を訪問します。

  1. 私の親

はない

  1. 私の親
  2. 子ビュー

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

編集:ルーティング イベントの詳細については、MSDN の Routed Events Overviewを参照してください。また、これを示す素敵な画像もあります。

ここに画像の説明を入力

于 2012-11-20T14:37:44.427 に答える