【发布时间】:2013-02-12 21:38:44
【问题描述】:
我有一个 WrapPanel,其中包含任意数量的锯齿状大小的元素。我想为我的项目实现拖动选择。
如何对一个点进行 HitTest 似乎很明显,但是如何找到矩形区域内的所有项目?
【问题讨论】:
标签: wpf
我有一个 WrapPanel,其中包含任意数量的锯齿状大小的元素。我想为我的项目实现拖动选择。
如何对一个点进行 HitTest 似乎很明显,但是如何找到矩形区域内的所有项目?
【问题讨论】:
标签: wpf
您可以将VisualTreeHelper.HitTest 与GeometryHitTestParameters 参数和HitTestFilterCallback 一起使用,以检查Visual 是否是Panel 的直接子级。
类似这样的:
var selectedElements = new List<DependencyObject>();
var rect = new RectangleGeometry(...);
var hitTestParams = new GeometryHitTestParameters(rect);
var resultCallback = new HitTestResultCallback(
result => HitTestResultBehavior.Continue);
var filterCallback = new HitTestFilterCallback(
element =>
{
if (VisualTreeHelper.GetParent(element) == panel)
{
selectedElements.Add(element);
}
return HitTestFilterBehavior.Continue;
});
VisualTreeHelper.HitTest(
panel, filterCallback, resultCallback, hitTestParams);
看起来有点复杂,但HitTestFilterCallback 是获取视觉树中所有视觉对象的必要条件,而不仅仅是那些实际被击中的对象。例如,如果您的面板包含 Label 控件,则只会为每个 Label 的 Border 和 TextBlock 子 Visuals 调用 HitTestResultCallback。
【讨论】:
控制命中测试可见性的选项是IsHitTestVisible 属性。该属性允许您控制命中测试的可见性,而不管 UIElement 使用哪个画笔呈现。
另外,您想将填充设置为透明
<Rectangle Width="200" Height="200" Margin="170,23,12,35" Fill="Transparent" IsHitTestVisible="True" />
【讨论】: