【问题标题】:Drag/drop controls onto child Canvas without parent Canvas being notified在不通知父 Canvas 的情况下将控件拖放到子 Canvas
【发布时间】:2016-02-12 03:21:50
【问题描述】:

我正在尝试创建一个视觉“设计器”,它允许用户将控件从工具箱拖到设计画布上。优秀的教程here 帮助我建立了一个基本系统 - 我可以从工具箱中拖动控件,选择它们并调整它们的大小等。除此之外,代码使用修改后的Canvas 控件,覆盖OnDrop方法。

但是,我想为用户提供在设计中定义“面板”的选项:实际上更小的 Canvas 包含工具箱控件 - 例如:

因此,当用户将按钮拖到 Canvas_1 上时,OnDrop 会触发并且一切正常。但是,如果用户创建 Canvas_2,然后将按钮拖到 Canvas_2(其本身是 Canvas_1 的子控件)上,则父 OnDrop 仍然会触发,并且按钮会添加到 Canvas_1。

我尝试将 Canvas_2 的 ZIndex 设置为大于 Canvas_1,但无济于事 - 父级 Canvas 始终获取事件。我如何确保 Canvas_2 获得OnDrop 事件以控制登陆它?我应该使用其他方法吗?

【问题讨论】:

    标签: c# wpf drag-and-drop


    【解决方案1】:

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

    【讨论】:

    • 谢谢,帮了大忙。
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 2012-10-19
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2014-03-16
    • 1970-01-01
    相关资源
    最近更新 更多