C# 将控件拖放到子画布上,而不通知父画布
我正在尝试创建一个可视化的“设计器”,允许用户将控件从工具箱拖到设计画布上。优秀的教程帮助我建立了一个基本的系统——我可以从工具箱中拖动控件,选择并调整它们的大小等。除此之外,代码使用了一个修改过的C# 将控件拖放到子画布上,而不通知父画布,c#,wpf,drag-and-drop,C#,Wpf,Drag And Drop,我正在尝试创建一个可视化的“设计器”,允许用户将控件从工具箱拖到设计画布上。优秀的教程帮助我建立了一个基本的系统——我可以从工具箱中拖动控件,选择并调整它们的大小等。除此之外,代码使用了一个修改过的Canvas控件,覆盖了OnDrop方法 但是,我想给用户一个在设计中定义“面板”的选项:有效地缩小包含工具箱控件的画布-例如: 因此,当用户将按钮拖动到Canvas_1上时,OnDrop启动,一切正常。但是,如果用户创建Canvas_2,然后将按钮拖动到Canvas_2上-其本身是Canvas_1
Canvas
控件,覆盖了OnDrop
方法
但是,我想给用户一个在设计中定义“面板”的选项:有效地缩小包含工具箱控件的画布-例如:
因此,当用户将按钮拖动到Canvas_1上时,OnDrop
启动,一切正常。但是,如果用户创建Canvas_2,然后将按钮拖动到Canvas_2上-其本身是Canvas_1的子控件-则父控件仍会触发,并且按钮会添加到Canvas_1
我已经尝试将Canvas_2的ZIndex设置为大于Canvas_1,但没有效果-父Canvas始终获取事件。如何确保Canvas_2获得控件登陆的OnDrop
事件?我应该使用另一种方法吗?事件使用冒泡路由策略,这意味着事件将在可视树中从源元素开始向上移动,使沿途的所有元素都有机会处理事件
当您将某个内容放入内部画布
时,它会处理它,但不会停止事件传播,因此父元素(包含画布
)将再次处理它
在覆盖的OnDrop
方法中,您有一个DragEventArgs
参数。
如果要防止包含处理相同事件的元素,请将其Handled
属性设置为true
示例
我还创建了一个简单的派生画布
:
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>
需要注意的是,我添加了新的DependencyProperty
,名为StopDropPropagation
,并在内部画布中将其设置为true
。这将把Handled
设置为true
因此,当我在内部Canvas
中放置某些内容时,TextBlock
将只添加到该元素中:
谢谢,这帮了大忙。