以下代码应该在画布中移动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等。任何人都可以解释一下吗?
答案 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,但我很确定它会起作用。