当我们想打印控件内容时,如一个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 框架级别等效项)调用此方法,以便形成递归布局更新。此方法产生第二次布局更新。

修改后的代码如下:

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

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

 if (pd.ShowDialog() == true)
{
Window window = Window.GetWindow(grid1);
Point point = grid1.TransformToAncestor(window).Transform(new Point(, ));//获取当前控件 的坐标
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;

希望能帮助到有需要的人。

WPF打印控件内容的更多相关文章

  1. WPF 打印控件 无弹框打印。

    WPF中打印用到了 PrintDialog类. 其中设置打印属性的是PrintTicket,管理打印机的是PrintQueue. 实例如下: public class PrintDialogHelpe ...

  2. wpf打印控件 实现分页打印控件功能

    因为 要实现打印 wpf  listbox控件  数据特别多 要打印在 几张纸上    找了几天 都没有找到相关的例子 现在 解决了 在这里和大家分享一下 public void print(Fram ...

  3. WPF Popup 控件导致被遮挡内容不刷新的原因

    WPF Popup 控件导致被遮挡内容不刷新的原因 周银辉 今天在写一个WPF控件时用到了Popup控件,很郁闷的情况是:当popup关闭时,原来被popup挡住的界面部分不刷新,非要手动刷新一下(比 ...

  4. WPF学习06:转换控件内容为可存储图片

    在图形软件中,我们经常使用到"另存为图片"的功能,本文即介绍如何将WPF控件显示内容转换为图片. , , PixelFormats.Pbgra32); bitmapRender.R ...

  5. LODOP打印控件关联输出各内容

    Lodop打印控件利用SET_PRINT_STYLEA里面的“LinkedItem”可以把多个独立的内容关联起来,让它们顺序打印.这样,就可以实现很多效果,例如一些内容紧跟着表格下方输出,关联表格后就 ...

  6. wpf 深度复制控件,打印控件

    原文:wpf 深度复制控件,打印控件 <Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.micr ...

  7. 基于MVC4+EasyUI的Web开发框架经验总结(16)--使用云打印控件C-Lodop打印页面或套打报关运单信息

    在最新的MVC4+EasyUI的Web开发框架里面,我整合了关于网购运单处理的一个模块,其中整合了客户导单.运单合并.到货扫描.扣仓.出仓.查询等各个模块的操作,里面涉及到一些运单套打的操作,不过由于 ...

  8. winform 对话框,保存,另存为,还有打印控件

    学习的对话框的种类: 1.打开文件对话框(OpenFileDialog) 2.保存文件对话框(SaveFileDialog) 3.字体对话框(FontDialog) 4.颜色对话框(ColorDial ...

  9. lodop打印控件一点记录

    今天初步接触了下打印控件 LODOP实现了自动分页,高度宽度都可以自己设定来分页. 页码,使用LODOP.SET_PRINT_STYLE("ItemType", 2); LODOP ...

随机推荐

  1. Hive跨集群迁移

    Hive跨集群迁移数据工作是会出现的事情, 其中涉及到数据迁移, metastore迁移, hive版本升级等. 1. 迁移hdfs数据至新集群hadoop distcp -skipcrccheck ...

  2. spring boot集成Websocket

    websocket实现后台像前端主动推送消息的模式,可以减去前端的请求获取数据的模式.而后台主动推送消息一般都是要求消息回馈比较及时,同时减少前端ajax轮询请求,减少资源开销. spring boo ...

  3. 安卓 android studio 报错 WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and

    报错截图: 问题原因:compile会被在2018年底取消,会被imlementation替代,所以会报这个警告,解决警告的方式就是换成 imlementation 就好了 解决方法: 在 app 的 ...

  4. k8s记录-dockerfile

    FROM 代表基于哪个镜像 RUN 安装软件使用 MAINTAINER 镜像的创建者 CMD 容器启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD EN ...

  5. Ubuntu18.04 instsall XMind_8 and crack

    1.dowload XMind_8 linux install zip wget https://www.xmind.cn/xmind/downloads/xmind-8-update8-linux. ...

  6. GNU C之__attribute__

    __attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...

  7. 【ARTS】01_40_左耳听风-201900812~201900818

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  8. 时空卷积网络TCN

    1.写在前面 实验表明,RNN 在几乎所有的序列问题上都有良好表现,包括语音/文本识别.机器翻译.手写体识别.序列数据分析(预测)等. 在实际应用中,RNN 在内部设计上存在一个严重的问题:由于网络一 ...

  9. element组件 MessageBox不能显示确认和取消按钮,记录正确使用方法!

    这里是局部引入 调用方式:

  10. eNSP上VLAN的基础的配置及access接口

    本实验模拟公司内部,为不同的部门划分不同的VLAN ,形成的不同广播域,来保护信息的安全,拓扑图如下所示