事件DragDrop.DragEnter 使用冒泡路由策略,这意味着事件将从源元素开始在可视化树中向上传播,从而为沿途的所有元素提供处理事件的机会。
当您在内部Canvas 中放置某些内容时,它会处理它,但不会停止事件传播,因此父元素(包含Canvas)会再次处理它。
在覆盖的OnDrop 方法中,您有一个DragEventArgs 参数。
如果要防止包含元素来处理相同的事件,请将其 Handled 属性设置为 true。
示例
我也创建了一个简单的派生Canvas:
public class MyCanvas : Canvas
{
public static readonly DependencyProperty StopDropPropagationProperty = DependencyProperty.Register(
"StopDropPropagation", typeof (bool), typeof (MyCanvas), new PropertyMetadata(default(bool)));
public bool StopDropPropagation
{
get { return (bool) GetValue(StopDropPropagationProperty); }
set { SetValue(StopDropPropagationProperty, value); }
}
protected override void OnDrop(DragEventArgs e)
{
Children.Add(new TextBlock
{
Text = "Dropped here"
});
e.Handled = StopDropPropagation;
}
}
在视图中我放了两个,一个嵌套在另一个里面。
<local:MyCanvas AllowDrop="True" Background="DarkGray">
<local:MyCanvas Width="300" Height="300" Canvas.Left="100" Canvas.Top="10" Background="BurlyWood"
StopDropPropagation="True"></local:MyCanvas>
</local:MyCanvas>
需要注意的是,我添加了名为StopDropPropagation 的新DependencyProperty,并在内部Canvas 中将其设置为true。这会将Handled 设置为true。
因此,当我在内部 Canvas 中放置一些东西时,TextBlock 只会添加到该元素中: