首页 > 编程语言 >C# WPF PrintDialog 打印(2)

C# WPF PrintDialog 打印(2)

时间:2024-12-26 19:41:21浏览次数:3  
标签:Canvas UIElement C# 打印 canvas new printDialog WPF PrintDialog

前面https://www.cnblogs.com/yinyu5/p/18633910使用PrintVisual方法只打印了可见部分的元素,所以这里改为使用PrintDocument方法来进行打印。

需要引用System.Printing.dll

界面代码:

 1 <Window x:Class="WpfApp123.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:WpfApp123"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="600" Width="800">
 9     <Grid>
10         <Grid.RowDefinitions>
11             <RowDefinition></RowDefinition>
12             <RowDefinition></RowDefinition>
13             <RowDefinition Height="auto"></RowDefinition>
14         </Grid.RowDefinitions>
15         <Canvas x:Name="print_Canvas">
16             <Ellipse Margin="10" Height="100" Width="300">
17                 <Ellipse.Fill>
18                     <LinearGradientBrush>
19                         <GradientStop Color="Purple" Offset="0"></GradientStop>
20                         <GradientStop Color="DarkBlue" Offset="1"></GradientStop>
21                     </LinearGradientBrush>
22                 </Ellipse.Fill>
23             </Ellipse>
24             <Rectangle Height="80" Width="200" Margin="400 30 0 0">
25                 <Rectangle.Fill>
26                     <LinearGradientBrush>
27                         <GradientStop Color="Red" Offset="0"></GradientStop>
28                         <GradientStop Color="Green" Offset="0.5"></GradientStop>
29                         <GradientStop Color="DarkBlue" Offset="1"></GradientStop>
30                     </LinearGradientBrush>
31                 </Rectangle.Fill>
32             </Rectangle>
33             <TextBlock Canvas.Left="200" Canvas.Top="150" FontSize="50">
34                 ABCDEFG
35             </TextBlock>
36         </Canvas>
37         <Grid Grid.Row="1">
38             <DataGrid Name="print_dg">
39             </DataGrid>
40         </Grid>
41         <Grid Grid.Row="2" Margin="10">
42             <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
43                 <Button Height="40" Width="200" FontSize="20" Margin="3" Click="Button_Click">打印Canvas</Button>
44                 <Button Height="40" Width="200" FontSize="20" Margin="3" Click="Button1_Click">打印DataGrid</Button>
45             </StackPanel>
46         </Grid>
47     </Grid>
48 </Window>
View Code

使用PrintDocument方法的后台代码:

private void PrintDocument_Method()
        {
            PrintDialog printDialog = new PrintDialog();
            printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
            printDialog.PageRangeSelection = PageRangeSelection.AllPages;
            if (printDialog.ShowDialog() == true)
            {
                FixedDocument fixedDoc = new FixedDocument();
                Size pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
                PageContent pageContent = new PageContent();
                FixedPage fixedPage = new FixedPage();
                fixedPage.Width = pageSize.Width;
                fixedPage.Height = pageSize.Height;

                Canvas canvas = new Canvas();
                canvas.Height = print_Canvas.Height;
                canvas.Width = print_Canvas.Width;
                //复制Canvas里面的元素
                foreach (UIElement element in print_Canvas.Children)
                {
                    UIElement clonedElement = CloneElement(element);
                    canvas.Children.Add(clonedElement);
                }
                fixedPage.Children.Add(canvas);
                ((IAddChild)pageContent).AddChild(fixedPage);
                fixedDoc.Pages.Add(pageContent);
                printDialog.PrintDocument(fixedDoc.DocumentPaginator, "打印 Canvas");
            }
        }

        private UIElement CloneElement(UIElement element)
        {
            // 使用 XAML 序列化反序列化来实现 UIElement 的深度复制
            string xamlString = System.Windows.Markup.XamlWriter.Save(element);
            return (UIElement)System.Windows.Markup.XamlReader.Parse(xamlString);
        }
View Code

可以看到被遮挡的元素也能打印出来:

那么DataGrid中遮挡的数据该如何打印呢?特别是数据行数较多,可能需要多页打印时。

还是使用PrintDocument,这里做一个简单的分页处理。

标签:Canvas,UIElement,C#,打印,canvas,new,printDialog,WPF,PrintDialog
From: https://www.cnblogs.com/yinyu5/p/18634080

相关文章

  • Dash to Dock 安装配置(图文教程)
    原文:https://www.cnblogs.com/keatonlao/p/12705335.html DashtoDock 是一个用于GnomeShell的dock。这个扩展将dash移出了活动视图,将其转换为一个dock,以便更容易地启动应用程序,更快地在windows和桌面之间切换。侧面和底部放置选项是可用的。使用GNOME3桌面......
  • USACO JAN 09
    [USACO09JAN]SafeTravelG题面翻译【题目描述】给定一张有\(n\)个节点,\(m\)条边的无向图,对于任意的\(i\)(\(2\lei\len\)),请求出在不经过原来\(1\)节点到\(i\)节点最短路上最后一条边的前提下,\(1\)节点到\(i\)节点的最短路。特别地,保证\(1\)到任何一个点\(i\)......
  • spring boot 增加dynamic-datasource-spring-boot-starter多数据源依赖,项目打包后运行
    在本地idea运行正常,打包部署后运行会报错,经过github查询是dynamic-datasource-spring-boot-starter3.3.0版本存在问题,需要升级到3.3.1以上版本就可以正常运行<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-st......
  • LangChain(一)——构建简单的对话
    目录1、安装LangChainlangchainlangchain_communitylangchain_core2、搭建对话框架流式输出非流式输出多模态3、prompt注意1、安装LangChain首先安装LangChain相关包,运行:pipinstalllangchainpipinstalllangchain_communitypipinstalllangchain_corela......
  • ARCGIS入门之制作dem高程图——以江西省九江市为例
    哈啰这里是一只阿居斯(/k/不发音)(●ˇ∀ˇ●),今天带大家制作一张dem高程图~过程超详细!数据来源地理空间数据云——提供dem高程数据首页-地球资源数据云具体操作1.将九江市行政区划和研究区utm图块导入后搜索“镶嵌至新栅格”,选择utm影像,设置输出位置和像素类型2.搜索工......
  • linux系统下docker安装mysql
    记录一下步骤:1、拉取镜像:dockerpullvijayan/mysql5.62、创建mysql挂载用数据卷cd/data/software/mysqlmkdirconfmkdirlogmkdirdata3、创建mysql配置文件cd/data/software/mysql/conf vimmy.conf[client]#端口号port=3306[mysql]no-beepdefault-character......
  • RISC-V篇-VSCode+qemu+gdb可视化调试Linux Kernel
    https://zhuanlan.zhihu.com/p/4185359719 本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章!“VSCode+qemu+gdb调试OpenSBI确实很爽,那怎能少了调试kernel呢~~”01VScode调试MMU开启之前的kernel有了调试OpenSBI的基础,再调试kernel,那设置相当简单了,如果你还......
  • VScode中C/C++调试文件配置
    VScode中C/C++调试文件配置//launch.json{"version":"2.0.0","configurations":[{"name":"C/C++:gcc.exebuildanddebugactivefile",//调试配置名称"type":"......
  • 【科技前沿】零代码构建台风监测大屏:Experience Builder赋能风云气象卫星(FY-4A)应用
    本教程首发于极思课堂,极思课堂(极思课堂-GeoSceneOnline)是易智瑞信息技术有限公司面向公司客户、合作伙伴、GIS从业者、高校教师与学生以及热衷于GIS技术的极客们打造的一站式GIS前沿技术学习平台。欢迎大家访问、学习与关注。课程原文链接:极思课堂-GeoSceneOnlinehttp......
  • 关于LC串、并联谐振回路相关公式的基础概念提要
    串联谐振:阻抗最小,电流最大,用于放大特定频率的信号。并联谐振:阻抗最大,电流最小,用于选择或过滤特定频率的信号。1.每个符号的基本含义我们从最基础的每个符号含义开始:电路参数符号R:电阻表示电路中对电流的阻碍程度,单位是欧姆(Ω)。电阻会消耗电能,转化为热能。L:电感是......