【问题标题】:Getting the true visual bounding box of a WPF element?获取 WPF 元素的真实视觉边界框?
【发布时间】:2021-09-19 13:40:23
【问题描述】:

对于我的问题的简化版本,我想计算布局转换(甚至可能是渲染转换)形状的边界框,这样我就可以始终在形状周围完美地放置一个矩形,无论它是什么旋转或缩放可能。如果你能解决这个问题,我会很高兴。

更复杂的问题是计算任何框架元素的视觉边界框。我所说的“视觉边界框”是指框架元素中最顶部的可见像素决定了上界,最右边的可见像素决定了右边界,等等。如果你能解决这个问题,我会更开心.

我尝试过使用 LayoutInformation.GetLayoutSlot(),但这并没有以预期的方式工作。 “布局槽”实际上比实际范围大得多。我也尝试使用 VisualTreeHelper.GetDescendantBounds(),但由于我的测试形状的 VisualParent 受到保护,我无法访问此属性,并决定在进一步研究之前检查这里。

我希望有人可以提供一种简单的方法来获取 WPF 中元素的真实视觉边界框,这是在所有转换之后计算的。如果我的问题没有说清楚,请告诉我。

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:
    private Rect GetRectOfObject(FrameworkElement _element)
    {
        Rect rectangleBounds = _element.RenderTransform.TransformBounds(
            new Rect(_element.RenderSize);
    
        return rectangleBounds;
    }
    

    也许这会有所帮助。

    【讨论】:

    • new Rect(0, 0, _element.Width, _element.Height) 可以简化为new Rect(_element.RenderSize)
    • 对我来说,它只能通过使用 element.ActualWidthelement.ActualHeight 来工作
    【解决方案2】:

    使用VisualTreeHelper.GetDescendantBounds() 将获得良好的结果,并且您可以使用VisualTreeHelper.GetParent() 访问受保护的VisualParent 属性。但是,您可能想要对形状本身而不是其父对象调用 GetDescendantBounds,因为尽管它的名称如此,但该方法返回父对象及其所有后代的边界。

    【讨论】:

    • 当我对我的形状执行GetDescendantBounds() 时,它会返回一个矩形,它是原始未转换形状的边界,尽管形状上有任何转换。如果我使用GetParent() 获取形状的父级,然后将该父级转换为Visual,并将该Visual 传递给GetDescendantBounds(),它会返回一个比我的形状大得多的矩形。
    【解决方案3】:

    这个问题并不容易,因为控件可能会超出其边界。

    但如果您假设这不会发生,您可以通过使用parent.TranslatePoint(point_in_child_coord_system, child)(0,0)(child.ActualWidth,0)(child.ActualWidth, child.ActualHeight)(0,child.ActualHeight) 转换为父坐标系统来解决问题。然后对所有点的 x 和 y 坐标进行排序,并使用最小值和最大值找到边界框。

    注意:排序是必要的,因为可能有子轮换。

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2011-11-10
      • 2020-05-16
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      相关资源
      最近更新 更多