打印在代码隐藏中创建的 WPF 用户控件

本文关键字:WPF 用户 控件 创建 代码 隐藏 打印 | 更新日期: 2023-09-27 18:34:28

我有一个用户控件,我在代码中实例化并想打印。 当我打印此用户控件时,代码打印一张白纸。 这是为什么呢? 我的代码如下

private void PrintCurrentTab(object sender, RoutedEventArgs e)
{
    PrintDialog printDlg = new PrintDialog();
    var child = MyMainWindowViewModel.SelectedTab.Content;
    if (child is ScrollViewer)
    {
        child = (((ScrollViewer)child).Content);
    }
    if (printDlg.ShowDialog() == true)
    {
        var printControl = new PrintingTemplate();
        printDlg.PrintVisual(printControl, "User Control Printing.");
    }
}

我的用户控件如下

<UserControl x:Class="MyApp.Views.PrintingTemplate"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         MinHeight="500"
         MaxHeight="1000"
         MinWidth="200"
         MaxWidth="1000"
         Height="1056"
         Width="816">
    <StackPanel>
        <Grid>
            <Image Source="..'Resources'Images'PrintLogo.jpg" Width="150" HorizontalAlignment="Right" Margin="20"/>
            <Rectangle Fill="Black" Margin="10,40,150,0" Height="2"/>
        </Grid>
        <Grid Name="PrintingGrid"/>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
            <Label Content="Printed By:"/>
            <Label Name="PrintedBy"/>
            <Label Content="Printed On:"/>
            <Label Name="PrintedDate"/>
        </StackPanel>            
    </StackPanel>
</UserControl>

打印在代码隐藏中创建的 WPF 用户控件

我遇到了类似的问题,我能够从某些计算机打印,但不能从物理打印机上的一台(只有空白页(打印(使用 XPS 工作正常(。我终于在这里得到了一个可行的解决方案:

» https://social.msdn.microsoft.com/Forums/vstudio/en-US/9eb79e11-ee5a-4687-ad4c-a6d96276a8f4/printing-a-wpf-usercontrol?forum=wpf

    UserControlToPrint.Measure(New Size(816, 1056))
    UserControlToPrint.Arrange(New Rect(New Size(816, 1056)))
    UserControlToPrint.UpdateLayout()

问候

来自魁北克的弗朗索瓦

也许以下代码中的代码是罪魁祸首

 if (printDlg.ShowDialog() == true)
    {
        var printControl = new PrintingTemplate();
        printDlg.PrintVisual(printControl, "User Control Printing.");
    }

尝试获取当前控件的句柄,而不是创建新的

你调试

过这个吗? 你的问题似乎不完整,我真的不知道你想完成什么。 我确实注意到缺少一个重要的步骤。 以下是我的一些问题:

  1. MyMainWindowViewModel.SelectedTab.Content == null吗?
  2. child的类型是什么?
  3. child = (((ScrollViewer)child).Content);的目的是什么——那很丑陋
  4. 实际上,为什么那里的任何child代码都没有被使用!

无论如何,您不能打印未经过布局阶段的控件。 所以现在你可能会问,"如何强制呈现控件?很简单,像这样:

if (printDlg.ShowDialog() == true)
{
    var printableArea = new Size(printDlg.PrintableAreaWidth, printDlg.PrintableAreaHeight)
    var printControl = new PrintingTemplate();
    //Set the drawing dimensions/boundaries - notice (Acutal)Width/Height = 0
    printControl.Measure(printableArea);
    printControl.Arrange(new Rect(new Point(), printableArea);
    //"Render"!
    printcontrol.UpdateLayout();
    //At this point you should see the (Acutal)Width/Height be > 0!      
    printDlg.PrintVisual(printControl, "User Control Printing.");
}