WPF测试了一个矩形区域

Jam*_*s L 3 wpf

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

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

Cle*_*ens 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);
Run Code Online (Sandbox Code Playgroud)

它看起来有点复杂,但是HitTestFilterCallback必须在视觉树中获取所有Visual,而不仅仅是实际受到攻击的那些.例如,如果面板包含Label控件,HitTestResultCallback则只会为每个Label的Border和TextBlock子Visuals调用.