gpt4 book ai didi

c# - RoutedEvent 隧道未到达子节点

转载 作者:太空狗 更新时间:2023-10-29 22:23:17 25 4
gpt4 key购买 nike

我找到了很多解释冒泡的例子,但没有一个是关于隧道的,这是关于隧道的,例如 parent 到 child 。我认为我的主要问题是我不明白如何在 child (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的封装是必须的,应该没问题吧? child 是通过 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

最佳答案

这不是隧道路由策略的工作原理。隧道意味着事件将从根开始,沿着树路径向下到达调用控件。例如,如果我们有以下可视化树

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

然后如果 MyParent 将引发隧道事件,则隧道事件将访问:

  1. 窗口
  2. 我的 parent

  1. 我的 parent
  2. subview

总而言之,冒泡事件总是从引发事件的控件开始,到可视化树的根部停止,而隧道事件将从可视化树的根部开始,到引发事件的控件结束(确切地说相同的路径,只是相反的顺序)。

编辑:您可以在 MSDN's Routed Events Overview 中阅读更多关于路由事件的信息.它也有一个很好的图像来证明这一点:

enter image description here

关于c# - RoutedEvent 隧道未到达子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13475384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com