【问题标题】:WPF hit testing a rectangular areaWPF命中测试矩形区域
【发布时间】:2013-02-12 21:38:44
【问题描述】:

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

如何对一个点进行 HitTest 似乎很明显,但是如何找到矩形区域内的所有项目?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    您可以将VisualTreeHelper.HitTestGeometryHitTestParameters 参数和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

    【讨论】:

      【解决方案2】:

      控制命中测试可见性的选项是IsHitTestVisible 属性。该属性允许您控制命中测试的可见性,而不管 UIElement 使用哪个画笔呈现。

      另外,您想将填充设置为透明

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多