我可以让这更容易吗?在WPF中冒泡与隧道?

时间:2011-01-28 20:16:29

标签: c# wpf events

我正在使用WPF应用程序中的拖放功能。

我有一个树形结构,如下所示。

StackPanel
 - Border 1
   - Grid A
     - Grid 1
     - Grid 2
 - Border 2
   - Grid B
     - Grid 1
     - Grid 2

这是我尝试在WPF应用程序中显示UIElements的树形表示。

因此堆栈面板包含带有嵌套网格的网格。这些是在代码中动态定义的,而不是在XAML中定义的。

我有内部网格(1& 2)处理拖放事件。我遇到的问题是,当执行一个drop操作,并且它被丢弃在其中一个网格的边界上时,它会掉落并击中StackPanel Drop。我想要做的是当一个项目被放在边框上时,我希望它能够落到同一个drop事件处理程序中。

我对Routed Events和Bubbling and Tunneling事件的想法相当新。我知道我需要这个事件沿着元素层次结构传播,这让我相信我需要“隧道”事件。这是否意味着我应该将边框附加到事件处理程序。现在我有以下代码可以让网格订阅这个活动。

fieldItemGrid.PreviewDrop += Grid_Drop;

private void Grid_Drop(object sender,DragEventArgs e)
{
        //React to Drop Event Here
}

我能够做一些更简单的事情然后重写在Border_Drop事件中的代码吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

我认为最好在应该充当掉落区域的区域周围添加一个非常紧密(无填充)的容器(例如,网格)。然后使用紧密的容器来处理掉落。

这样,指定的边界无关紧要。只有紧密容器的填充或儿童控件的边缘才会搞砸。

答案 1 :(得分:1)

路由处理预览事件的方式从树的顶部开始,直到它到达发起事件的元素,然后正常事件从元素本身开始并向树的顶部开始。

在你的情况下,如果border是drop target,序列就是这样(如果事件未处理):

  • PreviewDrop - >的StackPanel
  • PreviewDrop - >边界
  • Drop - >边界
  • Drop - >的StackPanel

因此,当网格外部的元素发生掉落时,事件将永远不会到达任何内部网格。换句话说,它永远不会隧道进入放置目标的任何子节点,因为隧道停止发生丢弃的位置。这是有道理的,如果不止一个孩子,怎么知道哪个孩子是正确的孩子?

因此,您必须在可视化表示概念性放置目标的最大元素上安装放置事件处理程序。您可以切换“Border 1”和“Grid A”的顺序,也可以将“Grid A”的drop事件处理程序移动到“Border 1”。