私はバブリングについて多くの例を見つけましたが、トンネリングについてはこれはトンネルに関するものです。例えば、親から子へ。私の主な問題は、私はどのように子に(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に届かないということです。
:それはまた、これを証明する素敵なイメージを持っています。なぜMyParentがルートであることをプログラムに伝えることができないのですか? – Martin
これで分かりました。トンネリングは私の子供に届くことができません。私はそれらのドックを読んだが、何とかこのように理解していなかった。私はInterfacesを使って問題を解決し、単にデータを渡します(これは計画Bでした)。優秀な説明をありがとう。 – Martin
トンネリングは役に立たないわけではありません。単に、試みているタスクとは異なるタスクに使用されています。たとえば、キー押下をキャプチャしてTextBoxに到達する前にイベントをキャンセルすることによって、TextBoxの特定の文字の入力を禁止することができます。 –