【问题标题】:Moving buttons in a Canvas在画布中移动按钮
【发布时间】:2011-10-18 16:36:08
【问题描述】:

当鼠标悬停在 UIElements 上并且用户点击 Ctrl 时,以下代码应该在画布中移动 UIElements。

void keydown(Object sender, KeyEventArgs e)
        {
            if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
            {
                control++;
                if (control == 1)
                {
                    drag = true;
                    elem = (UIElement)Mouse.DirectlyOver;
                }
                else
                    drag = false;
                control %= 2;
            }
        }

        void mousemove(object sender, MouseEventArgs e)
        {
            Point p = e.GetPosition(canvas);
            if (drag)
            {
                if (elem == null) return;
                //Canvas.SetLeft(myButton, p.X);  <-- this works, but then why doesn't it work when I generalize it?
                Canvas.SetLeft(elem, p.X);
                Canvas.SetTop(elem, p.Y);
            }
        }

任何Shapes 组件,例如当我将鼠标悬停在矩形上并点击控件时,矩形会移动。但它不适用于按钮、文本框、文本视图等。谁能解释一下?

【问题讨论】:

  • 在说按钮的情况下是 elem == null 吗?
  • 我会写这个声明以防万一出现任何异常......不,elem 不为空......

标签: c# wpf c#-4.0 wpf-controls


【解决方案1】:

Mouse.DirectlyOver 的文档说:

控件可以由多个元素组成。 DirectlyOver 报告鼠标指针在复合控件中的特定元素,而不是控件本身。例如,根据指针位于 Button 的哪个部分,DirectlyOver 属性可以报告 Content 属性的 TextBox 或 ButtonChrome。

换句话说:按钮由几个子元素组成,例如 ButtonChrome 和 TextBlock(通常不是 TextBox——我认为这是 MSDN 页面上的错字)。当您调用 Mouse.DirectlyOver 时,您可能会得到其中一个元素,而不是 Button。

由于这些元素不是 Canvas 的父级(它们是 Button 控件模板中的某个对象的父级,很可能是 Grid),因此设置 Canvas.Left 和 Canvas.Top 附加属性将无效。

您可能想沿着可视化树(使用VisualTreeHelper.GetParent)向上走,直到找到您对拖动感兴趣的东西。如何确定是否对任何给定元素感兴趣取决于您。您可以一直走,直到找到与 Canvas 相关的东西,或者您可以一直走,直到找到给定类型之一的东西(当您找到从 Control 继承的东西时停下来可能是一个不错的起点)。

【讨论】:

  • 谢谢你。我知道按钮是由各种组件组成的,但是你能发布代码或者告诉我哪个组件是 Canvas 的父级吗?我有一个非常简单的布局。窗口 > 画布 > 按钮和形状
  • 我想通了!万分感谢! :-)
【解决方案2】:

我的猜测是这些事件被不起作用的控件的实现所吞噬。

我现在不在电脑前,但是没有 previewmousemove 事件吗?试试用那个?

更新:从头开始!

只需使用 e.Souce。事件源被设计为您可能感兴趣的元素。您需要转换为 UIElement,但我很确定这会起作用。

【讨论】:

  • 不,我没有……我会试一试的。
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
相关资源
最近更新 更多