Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将控件拖放到子画布上,而不通知父画布_C#_Wpf_Drag And Drop - Fatal编程技术网

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
将只添加到该元素中:


谢谢,这帮了大忙。