在画布中移动按钮

本文关键字:按钮 移动 布中 | 更新日期: 2023-09-27 18:11:40

当鼠标悬停在画布上,用户按Ctrl时,下面的代码应该移动画布上的ui元素。

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组件,例如矩形将移动,当我将鼠标悬停在他们,并点击控制..但它不工作与按钮,文本框,TextViews等。有人能解释一下吗?

在画布中移动按钮

Mouse.DirectlyOver的文档说:

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

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

因为这些元素不是Canvas的父元素(它们是Button的控件模板中的父元素,很可能是Grid),所以设置Canvas。左侧和画布。顶部附加的属性没有效果。

你可能想要沿着可视化树(使用VisualTreeHelper.GetParent)向上走,直到你找到你感兴趣的东西。如何确定是否对任何给定的元素感兴趣取决于您。你可以一直走到你的Canvas的父级,或者你可以一直走到你找到一个给定的类型集合(当你找到一些从Control继承的东西时,停下来可能是一个不错的开始)。

我的猜测是这些事件被无法工作的控件的实现所吞噬。

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

更新:刮!

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