好吧,这可能是一个奇怪的问题。但正如标题所说,你可以将 Grid 添加到 ContainerVisual。由于 Grid 继承了 Visual,我应该可以通过 Children.Add 来实现。
为什么我需要这个?好吧,我正在使用 FlowDocument 打印报告。这个报告需要有一个标题,由于流文档不支持标题,我决定在分页期间添加标题,使用在互联网上找到的解决方案。
此外,由于我不想手动绘制整个标题但能够在设计器中进行设计时对其进行编辑,因此我将其设计为一个单独的文件作为 Grid 元素。所以我的标题看起来像这样(我缩短了它):
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="2cm" Width="18.7cm">
<Grid.Resources>
    <!-- some resources -->
</Grid.Resources>
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="2cm"/>
    <ColumnDefinition/>
    <ColumnDefinition Width="2cm"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition/>
    <RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.RowSpan="2">
    <Image Source="Logo.jpg"/>
</Border>
<Border Grid.Column="1" Grid.RowSpan="2">
    <StackPanel>
        <Label Name="staje" Style="{DynamicResource naslov}"></Label>
        <Label Name="predmet" Style="{DynamicResource naslov}"></Label>
    </StackPanel>
</Border>
<Border Grid.Column="2" BorderThickness="1">
    <StackPanel>
        <TextBlock>Datum:</TextBlock>
        <Label Name="datum">22. 12. 2013.</Label>
    </StackPanel>
</Border>
<Border Grid.Column="2" Grid.Row="1" BorderThickness="1,0,1,1">
    <StackPanel>
        <TextBlock>Strana:</TextBlock>
        <Label Name="strana">
            1/2
        </Label>
    </StackPanel>
</Border>
</Grid>
在每次分页调用中,我使用以下代码加载标题:
    public FrameworkElement GetHeaderForPage(int Strana)
    {
        FrameworkElement header = Application.LoadComponent(new Uri("/Header.xaml", UriKind.Relative)) as FrameworkElement;
        Label lblTest = LogicalTreeHelper.FindLogicalNode(header, "staje") as Label;
        Label lblPredmet = LogicalTreeHelper.FindLogicalNode(header, "predmet") as Label;
        Label lblDatum = LogicalTreeHelper.FindLogicalNode(header, "datum") as Label;
        Label lblStrana = LogicalTreeHelper.FindLogicalNode(header, "strana") as Label;
        lblTest.Content = KakavTest;
        lblPredmet.Content = Predmet;
        lblDatum.Content = Datum;
        lblStrana.Content = string.Format("{0}", Strana);
        return header;
    }
最后在分页调用中,我将它放在页面中,如下所示:
        DocumentPage page = m_Paginator.GetPage(pageNumber);
        // Create a wrapper visual for transformation and add extras
        ContainerVisual newpage = new ContainerVisual();
        FrameworkElement header = headerGen.GetHeaderForPage(pageNumber);
    //    header.RenderTransform = new TranslateTransform(0, -header.ActualHeight+10);
        ContainerVisual smallerPage = new ContainerVisual();
        smallerPage.Children.Add(page.Visual);
        //smallerPage.Transform = new MatrixTransform(0.95, 0, 0, 0.95,
        //    0.025 * page.ContentBox.Width, 0.025 * page.ContentBox.Height);
        newpage.Children.Add(smallerPage);
        newpage.Children.Add(header);
        newpage.Transform = new TranslateTransform(m_Margin.Left, m_Margin.Top);
        RenderTargetBitmap bmp = new RenderTargetBitmap((int)m_PageSize.Width, (int)m_PageSize.Height, 96, 96, PixelFormats.Default);
        bmp.Render(newpage);
        ImageShow show = new ImageShow(bmp);
        show.Show();
        return new DocumentPage(newpage, m_PageSize, Move(page.BleedBox), Move(page.ContentBox));
ImageShow 类只是用代表 bmp 的图像打开新窗口。我正在使用它来查看问题是否存在于为在 DocumentViewer 中显示页面所做的进一步处理中。但由于 ImageShow 不显示标题 Grid,看来我做错了什么。
简而言之: 您能否将 Grid 元素作为子项添加到 ContainerVisual 并正确绘制它。还是我需要手绘?