首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >确定对象是否可见并可单击

确定对象是否可见并可单击
EN

Stack Overflow用户
提问于 2011-03-13 07:34:29
回答 2查看 2.1K关注 0票数 6

我正在寻找有效的方法来确定一个控件是否实际上是可见的和可点击的。我的意思是,除了检查对象的可见性之外。

我可以检查RenderSize,如果任何父元素被折叠,那么这个值将是0,0。所以这也很简单。我还可以遍历可视化树,查看是否将所有元素的不透明度设置为1。

我不知道如何很好地检查这些场景:

  1. The对象被其他对象所阻塞。显然,可以使用FindElementsInHostCoordinates()并进行计算,以找出这些对象的阻塞程度,但这可能是过分的。我还可以制作一个有关对象的“屏幕快照”和整个页面的“屏幕快照”,并检查我的对象所在的像素是否与实际的对象像素匹配。这听起来像是一个过火的too.
  2. The对象被一个仍然“吞食”的透明对象所阻碍。在这个场景中,第一个问题的解决方案仍然可能失败。

更新(另一个场景)

  1. The对象超出了父对象/屏幕的界限。除了大量的calculations?

之外,还有什么其他的方法可以找到这个问题吗?

有更好的主意吗?我错过了什么吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-13 08:00:46

您可以编程地测试元素的可见性和HitTestVisible属性,但是除了这个之外,如果单击事件将被转发到元素或其上面的元素吞没,则实际上无法测试--因为阻塞或转发单击可能发生在事件处理程序方法中,而您根本无法以通用的方式确定这些单击。

以下列例子为例:

您想要测试的it

  • ChildElement面板是否是可单击的,其中面板上有一个事件处理程序,用于处理单击事件,它是可见的,其HitTestVisible属性设置为true。基于此,您还不能决定是否将事件转发给:在ChildElement的单击事件处理程序中,它可以将事件的Handled属性设置为true,以阻止接收事件的ParentPanel,或者将事件保持为假,从而使ParentPanel接收事件。

因此,如果涉及自定义EventHandlers,您将无法确定一个元素是否可点击。您最多能做的就是检查子元素和父元素上的VisiblityIsHitTestVisible属性,并使用TransformToVisual方法检查子/父元素的相对呈现位置。

票数 3
EN

Stack Overflow用户

发布于 2011-03-13 08:06:27

你在找VisualTreeHelper.FindElementsInHostCoordinates。返回的第一个元素将是鼠标单击/点击该像素的元素。当然,正如Gergely所说,您无法判断该元素是否会忽略单击并将其传递给您。

下面是一个示例函数:

代码语言:javascript
复制
// pass in a point and the UIElement that the point is relative to
// (or null if the point is relative to the root visual)
public static UIElement HitTest(Point p, UIElement relativeTo = null)
{
    if (relativeTo != null)
        p = relativeTo.TransformToVisual(Application.Current.RootVisual)
    return VisualTreeHelper
          .FindElementsInHostCoordinates(p, Application.Current.RootVisual)
          .FirstOrDefault();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5288109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档