移动画布中的按钮

时间:2011-10-18 16:36:09

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

以下代码应该在画布中移动UIElements,当鼠标悬停在它们上面时,用户按Ctrl键。

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组件,例如当我将鼠标悬停在它们上方时,矩形会移动,然后点击控制..但它不适用于Buttons,TextBoxes,TextViews等。任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

Mouse.DirectlyOver的文档说:

  

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

换句话说:一个Button由几个子元素组成,比如ButtonChrome和TextBlock(通常不是TextBox - 我认为这是MSDN页面上的拼写错误)。当你致电Mouse.DirectlyOver时,你可能会得到其中一个元素,而不是按钮。

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

您可能想要沿着可视树(使用VisualTreeHelper.GetParent)走,直到找到您对拖动感兴趣的内容。如何确定您是否对任何给定元素感兴趣取决于您。你可以去找到你的Canvas的主要内容,或者你可以直到你找到一些特定类型的东西(当你发现一些来自Control的东西可能是一个合适的起点时停止)。 / p>

答案 1 :(得分:0)

我的猜测是那些事件被执行不起作用的控件所吞噬。

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

更新:刮擦!

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