UserControl 模板不显示画布的子项

Posted

技术标签:

【中文标题】UserControl 模板不显示画布的子项【英文标题】:UserControl template is not displaying the Children of a Canvas 【发布时间】:2021-11-10 01:04:21 【问题描述】:

我正在创建一个构建图表的应用程序。这些图表由添加到 Canvas 的 UserControls 组成。我想使用在 xaml 中创建的格式化 UserControl 打印这些图表的集合。

PrintDialog pd = new PrintDialog();
FixedDocument document = new FixedDocument();
FixedPage page = new FixedPage();

document.DocumentPaginator.PageSize = new Size(pd.PrintableAreaWidth,pd.PrintableAreHeight);
page.Width = document.DocumentPaginator.PageSize.Width;
page.Height= document.DocumentPaginator.PageSize.Height;

PageTemplate template = new PageTemplate();
template.canvas = BuildCanvasFunction();

FixedPage.SetTop(template,0);
FixedPage.SetLeft(template,0);
page.Children.Add(template);

PageContent content = new PageContent();
content.Child = page;
document.Pages.Add(content);
pd.PrintDocument(document.DocumentPaginator, "Document");

Template.Xaml 模板

<Grid>
   <Grid.RowDefinition>
      <RowDefinition Height="*"/>
      <RowDefinition Height="6*"/>
   </Grid.RowDefinition>

   <TextBlock Text="Test" Grid.Row="0"/>
   <Canvas Grid.Row="1" Name="canvas"/>
<Grid>

我遇到的问题是,尽管画布显示,但它的子项都没有。该模板仅显示一个空白画布。我已与调试器核对以确认画布具有所有未显示的子级。

模板中的 TextBlock 正在正确显示。模板的 xaml.cs 目前是空的,因为我没有对模板做任何事情,我只是用它来组织预先存在的控件。

Diagram 通常在 UI 中显示的顺序是:TabControl>TabItem>ScrollViewer>Canvas。此配置正确显示图表。将图表添加到模板时,子级无法显示。

【问题讨论】:

【参考方案1】:

当您说“打印”时,您使用的是什么驱动程序?打印到 PDF 驱动程序?因为我遇到了各种各样的问题。我的文档在物理打印机上打印得很好,但在 MS Print-to-PDF 驱动程序上却是空白的。

但如果我使用第三方 Print-To-PDF 驱动程序,它们看起来很棒。

【讨论】:

是的,当我使用打印到 pdf 驱动程序时会发生这种情况。虽然为了确认这不仅仅是我试图在应用程序中显示固定页面的驱动程序,但行为仍然存在。它将显示画布,但不显示其子级。 在您担心打印 XAML 页面之前,您需要担心在 UI 中正确显示它们。如果这对您不起作用,那么问题出在您的 XAML 中,而不是在打印代码中。 我同意,如果我将图表添加到 Scrollviewer 中,我可以很好地显示图表,这就是它在 UI 中的查看方式。仅当我尝试将画布添加到 FixedPage 以进行打印时,此问题才相关。 我认为您的下一步是编辑您的问题,向我们展示您是如何构建文档的,而不是您尝试如何打印它。当我这样做时,我在 XAML 中声明了DocumentViewer。我设置它的对齐值以确保它填满屏幕。然后,在代码隐藏中,在Loaded 事件处理程序中,在代码隐藏中,我创建我的页面并将它们添加到子级。没有看到你做事的方式,这里没有人可以帮助你 我刚刚尝试在 UI 中显示模板,只是意识到模板本身并没有显示画布的子项。基于此,我不认为这是我最初认为的 FixedPage 问题。另外关于我如何构建文档,而不是设置页面宽度和高度,我上面提出的就是我所有的 atm。在开始格式化文档之前,我确保图表能够正确显示。我的 PageTemplate 类是一个 UserControl,我不确定这是否会导致画布子项不显示的问题。

以上是关于UserControl 模板不显示画布的子项的主要内容,如果未能解决你的问题,请参考以下文章

将子级添加到 UserControl

绑定ListBox中Usercontrol的DependencyProperty

WPF 用户控件不呈现。 UserControl 使用 DataTemplates 实例化

如何在画布内拖动用户控件

#400 – 使用ItemsPanel 属性将WrapPanel 作为ListBox的显示面板(Using a WrapPanel as the Items Panel for a ListBox)(

WPF:带有 2 个(或更多!)ContentPresenters 的模板或 UserControl 以在“插槽”中呈现内容