gpt4 book ai didi

silverlight - 有没有办法对禁用的控件进行测试?

转载 作者:行者123 更新时间:2023-12-02 04:14:01 26 4
gpt4 key购买 nike

我试图检测鼠标光标下的控件,无论控件是否启用。
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;
}

然后,您只需确保从 MouseMove 处理程序传入的点是相对于 Application.Current.RootVisual 的。 :
IEnumerable<UIElement> elements = FindAllElementsInHostCoordinates(e.GetPosition(Application.Current.RootVisual), this);

关于silverlight - 有没有办法对禁用的控件进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3678240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com