WPF测试了一个矩形区域

时间:2013-02-12 11:57:39

标签: wpf

我有一个WrapPanel包含任意数量的锯齿状大小的元素。我想为我的项目实施拖动选择。

对于一个点来说,HitTest似乎很明显,但是我怎样才能找到矩形区域内的所有项目?

2 个答案:

答案 0 :(得分:5)

您可以使用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是获取可视树中所有Visual的必要条件,而不仅仅是实际受到攻击的那些。例如,如果您的面板包含Label控件,则只会为每个Label的Border和TextBlock子Visuals调用HitTestResultCallback

答案 1 :(得分:-1)

控制命中测试可见性的选项是IsHitTestVisible属性。无论渲染UIElement的画笔如何,此属性都允许您控制命中测试可见性。

此外,您要将“填充”设置为“Transperent”

 <Rectangle  Width="200" Height="200" Margin="170,23,12,35" Fill="Transparent" IsHitTestVisible="True"   />