当前位置: 首页 > news >正文

WPF打印控件内容

当我们想打印控件内容时,如一个Grid中的内容,可以用WPF中PrintDialog类的PrintVisual()方法来实现

界面如下:

XAML代码如下

<Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width="300"/></Grid.ColumnDefinitions><Grid Grid.Column="0"><Grid Width="800" Name="grid1"><TextBlock TextWrapping="Wrap" FontSize="15">Control authors who want to customize the arrange pass of layout processing should override this method. The implementation pattern should call M:System.Windows.UIElement.Arrange(System.Windows.Rect) on each visible child element, and pass the final desired size for each child element as the finalRect parameter. Parent elements should call M:System.Windows.UIElement.Arrange(System.Windows.Rect) on each child, otherwise the child elements will not be rendered.
Many derived classes offer implementations of this method. Prominent ones include: M:System.Windows.Window.ArrangeOverride(System.Windows.Size), M:System.Windows.Controls.Page.ArrangeOverride(System.Windows.Size) and M:System.Windows.Controls.Control.ArrangeOverride(System.Windows.Size).</TextBlock></Grid></Grid><Grid Grid.Column="1"><Button Height="30" VerticalAlignment="Top" Click="Button_Click">打印</Button></Grid></Grid>

当我们点击按钮时,进行打印

按钮事件:

           PrintDialog pd = new PrintDialog();if (pd.ShowDialog() == true){pd.PrintVisual(this.grid1, "");}

这时我们会发现,虽然 打印的内容是指定的,但打印的大小却是整个窗体的大小,而不仅仅是指定的区域大小。

然后我们就需要用到UIElement的Arrange 方法

MSDN上的解释是

定位子元素,并确定 UIElement 的大小。 父元素从它们的 ArrangeCore 实现(或者是 WPF 框架级别等效项)调用此方法,以便形成递归布局更新。此方法产生第二次布局更新。

修改后的代码如下:

1 if (pd.ShowDialog() == true)
2             {                
3                 this.grid1.Arrange(new Rect(new Size(grid1.ActualWidth, grid1.ActualHeight)));
4                 pd.PrintVisual(this.grid1, "");               
5             }

这样操作以后,打印的大小不再是整 个窗体的大小了,但打印完之后 ,控件 的位置却发生了变化 ,这时候我们只需要再调用一次Arrange方法,将它放回原来的位置就行了

 if (pd.ShowDialog() == true){               Window window = Window.GetWindow(grid1);Point point = grid1.TransformToAncestor(window).Transform(new Point(0, 0));//获取当前控件 的坐标this.grid1.Measure(new Size(grid1.ActualWidth,grid1.ActualHeight));this.grid1.Arrange(new Rect(new Size(grid1.ActualWidth, grid1.ActualHeight)));pd.PrintVisual(this.grid1, "");this.grid1.Arrange(new Rect(point.X, point.Y, grid1.ActualWidth, grid1.ActualHeight));//设置为原来的位置}

这样就可以打印控件 内容了。

如果 想对打印机进行设置,可以查找 WPF PrintDialog的使用方法,下面是简单的设置

                 PrintTicket pt = new PrintTicket();PageMediaSize p = new PageMediaSize(PageMediaSizeName.ISOA4);//pt.PageBorderless = PageBorderless.Unknown;pt.PageMediaSize = p;//pt.PageOrientation = PageOrientation.Portrait;pd.PrintTicket = pt;

http://www.lryc.cn/news/426019.html

相关文章:

  • [C++][opencv]基于opencv实现photoshop算法图像剪切
  • 四十、大数据技术之Kafka3.x(3)
  • redis——基本命令
  • pytorch实现单层线性回归模型
  • 智能小家电能否利用亚马逊VC搭上跨境快车?——WAYLI威利跨境助力商家
  • 顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评
  • 深入理解 Kibana 配置文件:一份详尽的指南
  • 算法的学习笔记—链表中倒数第 K 个结点(牛客JZ22)
  • 聊聊场景及场景测试
  • Spring Web MVC入门(中)
  • Django后端架构开发:后台管理与会话技术详解
  • 挑战Infiniband, 爆改Ethernet(2)
  • Postman文件上传接口测试
  • stm32入门学习14-电源控制
  • [C++][opencv]基于opencv实现photoshop算法色相和饱和度调整
  • Github 2024-08-16Java开源项目日报 Top10
  • AI学习记录 - torch 的 matmul和dot的关联,也就是点乘和点积的联系
  • leetcode 885. Spiral Matrix III
  • mysql windows安装与远程连接配置
  • 子网掩码是什么以及子网掩码相关计算
  • 仿RabbitMQ实现消息队列
  • SpringBoot教程(二十三) | SpringBoot实现分布式定时任务之xxl-job
  • 微前端架构的数据持久化策略与实践
  • 讲解 狼人杀中的买单双是什么意思
  • 回归分析系列5-贝叶斯回归
  • oracle 数据中lsnrctl 是干啥的
  • Linux进程--进程地址空间
  • C语言传递指针给函数
  • 探索 Kubernetes 持久化存储之 Rook Ceph 初窥门径
  • 今日(2024 年 8 月 13 日)科技新闻