【问题标题】:Determine the bounding rect of a WPF element relative to some parent确定 WPF 元素相对于某个父元素的边界矩形
【发布时间】:2011-03-29 04:39:47
【问题描述】:

我认为这是一个非常简单的请求,但我似乎无法在搜索中找到决定性的答案。如何确定窗口中特定可视元素相对于其他父元素的边界?

我尝试过使用 LayoutInformation.GetLayoutSlot,但这似乎只是在 0,0 处返回 Rect,并不能反映元素的实际位置。

我想要做的是使用RenderTargetBitmap 对窗口进行“截图”,然后将其裁剪为特定元素,但我无法获得元素的边界以知道将位图裁剪为什么!

【问题讨论】:

    标签: c# wpf layout bounds rect


    【解决方案1】:

    很简单:

    public static Rect BoundsRelativeTo(this FrameworkElement element,
                                             Visual relativeTo)
    {
      return
        element.TransformToVisual(relativeTo)
               .TransformBounds(LayoutInformation.GetLayoutSlot(element));
    }
    

    事实上,把它放在一个单独的方法中可能有点过头了。

    【讨论】:

    • GetLayoutSlot 获取在布局中为元素分配的空间,但如果元素具有明确的宽度/高度和/或变换,则实际元素大小可能会有所不同。要获得“真实”大小的矩形,请尝试element.RenderTransform.TransformBounds(new Rect(element.RenderSize))
    • 这对我不起作用,请参阅下面的 Mauro Sampletro 或 DanW 的答案。
    【解决方案2】:

    LayoutSlot 选项根本不适合我。 这最终给了我一个相对于指定父/祖先控件的子位置:

        public static Rect BoundsRelativeTo(this FrameworkElement child, Visual parent)
        {
            GeneralTransform gt = child.TransformToAncestor(parent);
            return gt.TransformBounds(new Rect(0, 0, child.ActualWidth, child.ActualHeight));
        }
    

    【讨论】:

    • 这对我有用,接受的答案没有。在 .NET Framework 4.5.2 中使用 WPF 处理网格中的边框。
    【解决方案3】:

    考虑到我在这里找到的一些建议,这解决了我的问题。

    item.TransformToVisual( relativeToElement )
        .TransformBounds( new Rect( item.RenderSize ) );
    

    【讨论】:

      【解决方案4】:

      没关系,我终于设法使用LayoutInformation.GetLayoutSlot()(尽管我可能使用ActualWidth/ActualHeightRenderSize)和UIElement.TranslatePoint() 的组合来解决这个问题。

      当它可以像这样简单时,这似乎是一个相当复杂的解决方案:

      myElement.GetBounds( relativeElement );
      

      哦,好吧。也许是时候使用扩展方法了。 :)

      【讨论】:

      • 我是说应该有。
      • 能否请您展示完整的解决方案?我没有让它工作。相对于某些父元素,它总是错误的。现在,我使用myElement.PointToScreen(new Point()) 将所有内容转换为屏幕坐标,这对于处理WM_NCHITTEST 来说是可以的。但我仍然认为这是一种黑客行为。
      • 我们都很高兴您解决了您的问题。请在此处向我们提供您的解决方案。
      • @Nasenbaer 抱歉,我已经有一段时间没有进行 .NET 开发了。我建议阅读TranslatePoint 的文档。
      猜你喜欢
      • 2012-02-10
      • 1970-01-01
      • 2014-04-16
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      相关资源
      最近更新 更多