C# 在画布中移动按钮

C# 在画布中移动按钮,c#,wpf,c#-4.0,wpf-controls,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)

当鼠标悬停在画布中的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);
            }
        }
void keydown(对象发送方,KeyEventArgs e)
{
如果(e.Key==Key.LeftCtrl | | e.Key==Key.RightCtrl)
{
控件++;
如果(控制==1)
{
阻力=真;
elem=(UIElement)Mouse.DirectlyOver;
}
其他的
阻力=假;
控制%=2;
}
}
void mousemove(对象发送器,MouseEventArgs e)
{
点p=e.GetPosition(画布);
如果(拖动)
{
if(elem==null)返回;
//Canvas.SetLeft(myButton,p.X);的文档说明:

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

换句话说:一个按钮是由几个子元素组成的,比如一个按钮图标和一个文本块(通常不是一个文本框——我认为这是MSDN页面上的一个输入错误)。当你调用
Mouse.DirectlyOver
,你可能会得到其中的一个元素,而不是按钮

由于这些元素不是画布的父元素(它们是按钮控件模板中某个元素的父元素,很可能是网格),因此设置Canvas.Left和Canvas.Top附加属性将无效


您可能希望在可视化树上漫游(使用),直到找到您感兴趣的拖动对象。如何确定您是否对任何给定元素感兴趣取决于您自己。您可以一直漫游,直到找到画布的父对象,也可以一直漫游,直到找到某个给定类型集中的对象(当您发现某个事件从控件下降时停止可能是一个不错的开始)。

我的猜测是,这些事件被不起作用的控件的实现吞没了

我现在不在电脑前,但是否有previewmousemove事件?尝试使用它

更新:抓挠它


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

对于say Buttons,elem==null吗?我会在出现任何异常时使用该语句。不,elem不是null。不,我没有。我会尝试一下。谢谢。。我发现按钮是由不同的组件组成的,但是你能发布代码或者准确地告诉我哪个组件是画布的子组件吗?我有一个非常简单的布局。窗口>画布>按钮和形状我能找到它!非常感谢!:-)