作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图检测鼠标光标下的控件,无论控件是否启用。VisualTreeHelper.FindElementsInHostCoordinates
忽略具有 IsEnabled
的控件属性设置为 false
.有没有办法改变这种行为,或者有什么其他方法可以在特定的屏幕位置找到控件?
谢谢。
最佳答案
您可以实现自己的递归方法来搜索子树并将每个元素转换为应用程序的根视觉对象,以获得其“绝对”边界,然后测试“绝对”鼠标点是否在该区域内。
这可能不是您所需要的,但应该可以帮助您入门。我基本上做了替换FindElementsInHostCoordinates
具有相同的签名,因此可以在 MouseMove 处理程序中以相同的方式使用它。此方法仅尝试“ HitTest ”FrameworkElements,因为它需要知道 ActualWidth 和 ActualHeight 来计算命中区域。
private IEnumerable<UIElement> FindAllElementsInHostCoordinates(Point intersectingPoint, UIElement subTree)
{
var results = new List<UIElement>();
int count = VisualTreeHelper.GetChildrenCount(subTree);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(subTree, i) as FrameworkElement;
if (child != null)
{
GeneralTransform gt = child.TransformToVisual(Application.Current.RootVisual as UIElement);
Point offset = gt.Transform(new Point(0, 0));
Rect elementBounds = new Rect(offset.X, offset.Y, child.ActualWidth, child.ActualHeight);
if (IsInBounds(intersectingPoint, elementBounds))
{
results.Add(child as UIElement);
}
}
results.AddRange(FindAllElementsInHostCoordinates(intersectingPoint, child));
}
return results;
}
private bool IsInBounds(Point point, Rect bounds)
{
if (point.X > bounds.Left && point.X < bounds.Right &&
point.Y < bounds.Bottom && point.Y > bounds.Top)
{
return true;
}
return false;
}
Application.Current.RootVisual
的。 :
IEnumerable<UIElement> elements = FindAllElementsInHostCoordinates(e.GetPosition(Application.Current.RootVisual), this);
关于silverlight - 有没有办法对禁用的控件进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3678240/
我是一名优秀的程序员,十分优秀!