我在画布上放置一条线(让我们称之为第1行)并将鼠标输入,鼠标离开,鼠标向上和鼠标按下事件附加到它上面。然后创建另一行(第2行),附加相同的事件。选择任何行时,所有事件都可以正常工作。 出于某种原因,当创建的第一行被拖动并在第二行上释放时,该行不会在画布上释放,但是它仍然粘在鼠标指针上,直到从第二行进行另一次单击。当创建的最早行被拖过较新的行而不是相反时会发生此问题(第2行在第2行拖动和释放时出现问题但反之不然,或第1行超过2和3,第2行超过第3行等等 我不知道在解决这个问题时代码可能会有什么帮助,有人会有任何建议或者遇到过类似的问题吗?
答案 0 :(得分:0)
观察到的行为的原因很容易推断出来:
Panel
中的所有元素都有一个隐式z顺序,当en元素没有指定ZIndex
属性时,该顺序将生效。之前添加的元素具有比后来添加的元素更低的z顺序(xaml标记从上到下进行解析,之前出现的元素在前面添加)。
现在,如果您开始移动元素并且两个元素重叠,则z顺序仍然有效。因此,您之前添加的行将被视为物理上位于另一行之下,并且所有鼠标事件将转到z顺序中的最顶行。因此,移动的元素不会接收MouseUp事件,并且它仍粘在鼠标指针上,直到您将鼠标移离重叠区域并再次释放鼠标。
我可以想出几种方法来解决它:
最容易的事情就是在选择它时立即在元素上设置一个显式的ZIndex
,当你移动它时它总是在所有其他元素之上,当你释放它时你可以在任何地方再次清除ZIndex。一些示例代码可以给您一个想法:
private void OnElementSelected()
{
// todo: maybe we need to store the previous zindex value and re-assign it later
// to prevent it from getting lost
Canvas.SetZIndex(this, Int32.MaxValue);
}
private void OnElementReleased()
{
this.ClearValue(Canvas.ZIndexProperty);
// todo: maybe re-assign stored z-index value
}
另一种解决方案是在整个Canvas
上放置一个透明的MouseEventObserver,只要您选择一个元素就会激活它,然后元素的顺序就不重要了。
修改强>
关于Canvas.ZIndex
附加属性的一个很好的事实(许多开发人员可能不知道):它适用于每种面板类型,不仅适用于Canvas
。因此,您甚至可以使用Grid
在Canvas.ZIndex
内指定元素的z顺序。