打印在Code后面创建的WPF UserControl

时间:2014-12-17 20:18:13

标签: c# wpf printing user-controls

我有一个UserControl,我在代码后面实例化并想打印。当我打印此UserControl时,代码会打印一张白纸。为什么是这样?我的代码如下

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如下

<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>

3 个答案:

答案 0 :(得分:1)

以下代码中的 new 可能是罪魁祸首

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

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

答案 1 :(得分:0)

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

  1. MyMainWindowViewModel.SelectedTab.Content == null
  2. 什么是child的类型?
  3. child = (((ScrollViewer)child).Content);的目的是什么 - 那是丑陋的
  4. 其实为什么child代码在那里,没有被使用!
  5. 无论如何,您无法打印未经过布局传递的控件。所以现在你可能会问,“如何强制控件呈现?”简单,像这样:

    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.");
    }
    

答案 2 :(得分:0)

我遇到了类似的问题,我可以从一些计算机上打印但不能从一台(仅空白页)打印到物理打印机上(使用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()

此致

来自魁北克的François