WPF SharedSizeGroup 列未正确呈现

问题描述 投票:0回答:1

我遇到了

SharedSizeGroup
的问题,因为 WPF 网格中的列在我的 WPF 应用程序中无法正确呈现。网格包含在
FlowDocument
中,当我尝试将
FlowDocument
转换为
FixedDocument
时,会渲染一个包含具有 SharedSizeGroup 列的网格的视觉对象。生成固定文档或将视觉效果保存到图像时,共享列的大小不正确,导致渲染输出中的布局不正确。

这是我正在使用的代码:


Private Sub RenderPageContent(container As ContainerVisual, originalPage As DocumentPage)
    ' Render the Visual to a DrawingVisual
    Dim pageVisual As New DrawingVisual()
    Using ctx As DrawingContext = pageVisual.RenderOpen()
        ctx.DrawRectangle(New VisualBrush(originalPage.Visual), Nothing, New Rect(New Point(), originalPage.Size))
    End Using

    ' Add the rendered visual to the container
    container.Children.Add(pageVisual)
End Sub

但是,这种方法似乎无法正确处理 SharedSizeGroup 列。每个网格的列都会单独自动调整大小。如何正确渲染列? DocumentViewer 中的结果是正确的。但固定文档是错误的。 奇怪的是,它在某些计算机上正确呈现,而在其他计算机上则不然!??

wpf vb.net grid fixeddocument sharedsizegroup
1个回答
0
投票

问题是由于 WPF 的布局系统如何处理

SharedSizeGroup
造成的。此功能依赖于完整的布局过程来正确计算和应用跨多个 Grid 元素的共享列宽度。当在常规 UI 流之外渲染离屏视觉对象时,可能不会发生必要的布局过程,从而导致共享列的大小不正确。

要解决此问题,必须通过在窗口中临时托管可视化树来强制进行布局传递。这可确保 WPF 布局系统在渲染视觉对象之前正确应用

SharedSizeGroup
属性。

这是更正后的代码:

Private Sub RenderPageContent(container As ContainerVisual, originalPage As DocumentPage)
    ' Create a temporary window or UserControl to host the visual
    Dim tempWindow As New Window()
    tempWindow.Content = originalPage.Visual ' Assuming Visual is a FrameworkElement like Grid
    tempWindow.Width = originalPage.Size.Width
    tempWindow.Height = originalPage.Size.Height

    ' Force layout update
    tempWindow.UpdateLayout()

    ' Render the Visual to a DrawingVisual
    Dim pageVisual As New DrawingVisual()
    Using ctx As DrawingContext = pageVisual.RenderOpen()
        ctx.DrawRectangle(New VisualBrush(originalPage.Visual), Nothing, New Rect(New Point(), originalPage.Size))
    End Using

    ' Add the rendered visual to the container
    container.Children.Add(pageVisual)

    ' Clean up
    tempWindow.Close()
End Sub

此方法可确保 SharedSizeGroup 列正确呈现,从而解决您在离屏渲染期间遇到的布局问题。

© www.soinside.com 2019 - 2024. All rights reserved.