我正在寻找有效的方法来确定一个控件是否实际上是可见的和可点击的。我的意思是,除了检查对象的可见性之外。
我可以检查RenderSize,如果任何父元素被折叠,那么这个值将是0,0。所以这也很简单。我还可以遍历可视化树,查看是否将所有元素的不透明度设置为1。
我不知道如何很好地检查这些场景:
更新(另一个场景)
之外,还有什么其他的方法可以找到这个问题吗?
有更好的主意吗?我错过了什么吗?
谢谢!
发布于 2011-03-13 08:00:46
您可以编程地测试元素的可见性和HitTestVisible属性,但是除了这个之外,如果单击事件将被转发到元素或其上面的元素吞没,则实际上无法测试--因为阻塞或转发单击可能发生在事件处理程序方法中,而您根本无法以通用的方式确定这些单击。
以下列例子为例:
您想要测试的it
ChildElement面板是否是可单击的,其中面板上有一个事件处理程序,用于处理单击事件,它是可见的,其HitTestVisible属性设置为true。基于此,您还不能决定是否将事件转发给:在ChildElement的单击事件处理程序中,它可以将事件的Handled属性设置为true,以阻止接收事件的ParentPanel,或者将事件保持为假,从而使ParentPanel接收事件。因此,如果涉及自定义EventHandlers,您将无法确定一个元素是否可点击。您最多能做的就是检查子元素和父元素上的Visiblity和IsHitTestVisible属性,并使用TransformToVisual方法检查子/父元素的相对呈现位置。
发布于 2011-03-13 08:06:27
你在找VisualTreeHelper.FindElementsInHostCoordinates。返回的第一个元素将是鼠标单击/点击该像素的元素。当然,正如Gergely所说,您无法判断该元素是否会忽略单击并将其传递给您。
下面是一个示例函数:
// 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();
}https://stackoverflow.com/questions/5288109
复制相似问题