打印在代码隐藏中创建的 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>
我遇到了类似的问题,我能够从某些计算机打印,但不能从物理打印机上的一台(只有空白页(打印(使用 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.");
}
尝试获取当前控件的句柄,而不是创建新的
你调试
过这个吗? 你的问题似乎不完整,我真的不知道你想完成什么。 我确实注意到缺少一个重要的步骤。 以下是我的一些问题:
- 是
MyMainWindowViewModel.SelectedTab.Content == null
吗? child
的类型是什么?child = (((ScrollViewer)child).Content);
的目的是什么——那很丑陋- 实际上,为什么那里的任何
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.");
}