【问题标题】:Selecting and Deselecting overlapping graphics in silverlight在silverlight中选择和取消选择重叠图形
【发布时间】:2016-05-26 12:04:40
【问题描述】:

我在画布上放置一条线(我们称之为第 1 行)并附加鼠标进入、鼠标离开、鼠标向上和鼠标向下事件。然后创建另一行(第 2 行)并附加相同的事件。选择任何行时,所有事件都可以正常工作。 由于某种原因,当创建的第一行被拖动并释放到创建的第二行上时,该行不会在画布上释放,但是它仍然粘在鼠标指针上,直到再次单击离开第二行。当创建的最早的行被拖动到较新的行上时会出现此问题,反之亦然(当第 1 行被拖动并释放到第 2 行但反之亦然时,或第 1 行超过 2 和 3,以及第 2 行超过第 3 行时,会出现此问题等等 我不知道什么代码可能有助于解决这个问题,有没有人有任何建议或者可能遇到过类似的问题?

【问题讨论】:

    标签: c# silverlight mouseevent gis drag


    【解决方案1】:

    观察到的行为的原因很容易推断:

    Panel 中的所有元素都具有隐式 z 顺序,当没有为 en 元素指定 ZIndex 属性时,该 z 顺序将生效。较早添加的元素的 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。因此,您甚至可以使用Canvas.ZIndex 指定Grid 中元素的z 顺序。

    【讨论】:

    • 非常感谢您的回复 :) 在我的情况下,每个元素在创建时已经被赋予了明确的 z-index,总是比前一个元素大一个值,但这个问题仍然存在.我试图在鼠标向上和向下鼠标时更改画布的 z-index,因为我有一个属性来显示是否正在拖动元素,但这并没有解决问题。会不会有别的问题?感谢您的耐心等待。
    • 您是否分配显式且连续递增的 Z-Index 属性或隐式 z-order 是否生效都没有关系。每当您在其周围移动较早添加的元素时,它将不可避免地位于稍后添加的元素之下。因此,您必须确保当前选择和移动的元素具有当前存在的所有 z 索引中的最高值。而且我不明白为什么操纵画布的 z-index 应该以任何方式解决问题。
    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 2020-10-30
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多