using System . Windows ; using System . Windows . Controls ; using System . Windows . Documents ; using System . Windows . Markup ; using System . Windows . Media ; using System . Windows . Xps . Packaging ; namespace WpfPrintDemo public class XPSHelper DocumentViewer docView ; string xpsFile ; public XPSHelper ( string file , DocumentViewer documentViewer ) docView = documentViewer ; xpsFile = file ; public NameValueCollection NameValue { get ; set ; } public void SetPrint ( ) XpsDocument xpsDoc = new XpsDocument ( xpsFile , FileAccess . Read ) ; FixedDocumentSequence fds = xpsDoc . GetFixedDocumentSequence ( ) ; foreach ( DocumentReference DocRef in fds . References ) bool bForceReload = false ; FixedDocument DocFd = DocRef . GetDocument ( bForceReload ) ; foreach ( PageContent DocFpPc in DocFd . Pages ) FixedPage DocFp = DocFpPc . GetPageRoot ( bForceReload ) ; Search ( DocFp ) ; ( ( IAddChild ) DocFpPc ) . AddChild ( DocFp ) ; docView . Document = fds ; xpsDoc . Close ( ) ; private void Search ( FixedPage fixedPage ) var elements = fixedPage . Children ; Canvas containCanvas = new Canvas Width = fixedPage . Width , Height = fixedPage . Height , Background = Brushes . Transparent for ( int i = 0 ; i < elements . Count ; i ++ ) UIElement element = elements [ i ] ; if ( element is Glyphs ) Glyphs gps = ( Glyphs ) element ; string strMark = gps . UnicodeString ; strMark = strMark . TrimEnd ( new char [ ] { ':' , ':' } ) ; if ( NameValue . AllKeys . Contains ( strMark ) ) //判定当前数据是否为标签 TextBlock label = ModiGlyphs ( gps , NameValue . Get ( strMark ) ) ; containCanvas . Children . Add ( label ) ; else if ( element is Canvas ) Canvas canvas = element as Canvas ; SearchSubItem ( canvas ) ; fixedPage . Children . Add ( containCanvas ) ; //将画布添加到页面上 private void SearchSubItem ( Canvas canvas ) Canvas containCanvas = new Canvas Width = canvas . Width , Height = canvas . Height , Background = Brushes . Transparent var collection = canvas . Children ; for ( int i = 0 ; i < canvas . Children . Count ; i ++ ) var element = canvas . Children [ i ] ; if ( element is Glyphs ) Glyphs gps = ( Glyphs ) element ; string strMark = gps . UnicodeString ; //System.Diagnostics.Debug.Print(strMark);//观察用 strMark = strMark . TrimEnd ( new char [ ] { ':' , ':' } ) ; if ( NameValue . AllKeys . Contains ( strMark ) ) //判定当前数据是否为标签 TextBlock label = ModiGlyphs ( gps , NameValue . Get ( strMark ) ) ; containCanvas . Children . Add ( label ) ; //canvas.Children.RemoveAt(i); //移除标签 canvas . Children . Add ( containCanvas ) ; else if ( element is Canvas ) Canvas canvas1 = element as Canvas ; SearchSubItem ( canvas1 ) ; private TextBlock ModiGlyphs ( Glyphs gps , string content ) double x = gps . OriginX ; double y = gps . OriginY ; double fontSize = gps . FontRenderingEmSize ; TextBlock label = new TextBlock ( ) ; string strMark = gps . UnicodeString . Trim ( ) ; if ( strMark . Last ( ) == ':' || strMark . Last ( ) == ':' ) Canvas . SetLeft ( label , x + strMark . Trim ( ) . Length * fontSize ) ; Canvas . SetLeft ( label , x + strMark . Trim ( ) . Length * fontSize + fontSize ) ; Canvas . SetTop ( label , y - fontSize ) ; Canvas . SetZIndex ( label , 99 ) ; label . Foreground = Brushes . Red ; label . FontFamily = new System . Windows . Media . FontFamily ( "宋体" ) ; label . FontSize = fontSize ; label . Text = content ; return label ;

新建Print窗口

在窗口中添加DocumentViewer和Button

<Button Grid.Row="1" Height="30" Padding="5" Margin="3" Click="Button_Click">打印</Button>
<DocumentViewer Name="docView"/>

编写后台代码

 private void Button_Click(object sender, RoutedEventArgs e)
            string xpsFile = "出库单模板.xps";//读取模板
            XPSHelper helper = new XPSHelper(xpsFile, docView)
                NameValue = new NameValueCollection {
                {"订货日期","2020-01-10" },
                {"发货日期","2020-03-31" },
                {"市场编号","1000010001" },
                {"市场名称","三里屯" },
                {"公司订货热线","110120130" },
                {"公司订货传真","75757575" },
                {"客户名称","有钱的" },
                {"人","发货的" },  //发货的
                {"送货电话","9898998" },
                {"客户地址"," 北五环之外" },
            helper.SetPrint();

Step 3:观察打印效果

利用WPF+XPS完成套打任务step 1:xps模板建立step 2 建立项目建立 XPSHelper类新建Print窗口编写后台代码Step 3:观察打印效果step 1:xps模板建立为完成套打任务,首先利用Word建立如下文档,并保存为xps模板step 2 建立项目建立 WpfPrintDemo 项目,并将如下代码复制为新建类建立 XPSHelper类using Syste... <Window x:Class="WpfWord.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schema...
WPF三大模板实例运用 对于Windows桌面端应用开发来讲,WPF以其界面渲染的特殊性,灵活的界面布局而让人津津乐道,因为它能为用户提供更好的交互体验。如何利用WPF开发出让人赏心悦目的界面与功能呢?这里不仅仅只是布局的功劳,很大一部分都在WPF模板的灵活使用,那么这里就来聊一聊WPF的三大模板。 2、控件模板ControlTemplate WPF所有控件都是基于呈现与行为分离的模式,开发人员可以在自己应用场景中根据需要进行不同呈现状态的更改,而不会影响到控件的原始功能行为,能让我们在任意改变
由于wpf的UI使用xaml来表达的,所以我们们可利用这个优点,把WPF中的xaml元素另存为各样的文件,在很多时候我们都不须要这样的操作。把xaml保存为图片、字符串、XPS等等。这里我写了一些方法,以供大家参考.。 注意:以下保存操作前,一定要确保参数中的canvas有高和宽。 1.把canvas保存为文本文件 1: using System.Window...
WPF界面设计基础布局常用布局属性常用布局容器GridStackPanelWrapPanelDockPanelUniformGrid控件结构样式触发器触发器的类型:控件模板——ControlTemplate数据模板——DataTemplateBinding元素绑定数据驱动UI <Application x:Class="DragDropExample.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presen
<DockPanel > <Button Content="Preview" Margin="15" Click="Button_Click_1" DockPanel.Dock="Bottom" Height="76"/> <FlowDocumentPageViewer VerticalAlignment="Top" Width="300" Name="fd" BorderBrus.
在很土豪的微软免费给大家提供 GitHub 的构建服务器受到了小伙伴们的一堆好评之后,微软最近推出了 WPF 的 .NET Core 版本的模板,可以快速上手 WPF 项目的自动构建,支持自动进行单元测试和打包,同时输出打包的文件 首先需要创建一个 WPF 项目,最简单的创建方法就是通过下面一句命令行 dotnet new wpf -o Foo 此时就创建了一个叫 Foo 的 WPF 项目了,...
### 回答1: WPF是一种基于XAML语言的用户界面开发框架,使开发人员能够轻松创建漂亮和高效的桌面应用程序。MVVM是一种模式,它在WPF应用程序中广泛使用,它提供了一种分离UI和业务逻辑的方式,从而简化了代码结构。Prism是一个开源框架,它基于MVVM模式和WPF框架,提供了一些技术和工具,使开发人员能够更轻松地构建复杂的WPF应用程序。 使用WPF MVVM Prism框架可以帮助开发人员提高应用程序的可维护性和可扩展性。通过MVVM,开发人员可以创建一个适应各种应用程序场景的模型,并将其与UI分离。数据绑定和命令绑定使开发人员能够更轻松地将模型中的数据和逻辑与UI控件集成起来。Prism框架还提供了一些工具和功能,如模块化应用程序开发、事件聚合器、导航、对话框、异常处理等功能。这些工具使开发人员能够更轻松地构建复杂的应用程序,并提供了一种可扩展和可重用的方法。 总之,使用WPF MVVM Prism可以使开发人员更轻松地构建复杂的应用程序,并提高应用程序的可维护性和可扩展性。开发人员可以根据自己的需求选择使用这个框架来开发WPF应用程序,从而提高他们的工作效率和代码质量。 ### 回答2: WPF MVVM Prism是一种基于Windows Presentation Foundation(WPF)的软件开发模式,采用了MVVM(Model-View-ViewModel)设计模式和Prism框架来实现软件开发。MVVM是一种在WPF应用程序中使用的设计模式,它将应用程序的视图(View)与应用程序的模型(Model)分离开来,通过ViewModel来连接二者。Prism是一个帮助开发人员编写出复杂、可管控、可扩展和可维护的WPF应用程序的框架。 WPF MVVM Prism提供了很多好处:首先,它能实现软件的可重用性,通过将代码和视图分离,使得代码可以在多个不同的视图中重复使用,提高了开发效率。其次,它可以提高软件的可维护性,通过将逻辑和视图分离,确保逻辑代码与UI代码之间更少的耦合,提高了软件的可扩展性。此外,它还可以提高软件的可测试性,由于MVVM模式中将视图和逻辑分离开,所以开发人员可以更容易地编写出单元测试代码,来测试逻辑代码。最后,由于Prism框架提供了一些通用的,可定制的模块和服务,使得开发人员可以更快地实现常见功能、缩短开发时间。 总之,WPF MVVM Prism是一种高效、可扩展和易于维护的软件开发模式,它将视图和逻辑分离,提高了软件的可重用性和可测试性,同时也提高了软件的可扩展性和可复用性。 ### 回答3: WPF是一种桌面应用程序框架,它允许您为Windows创建高度交互式和可视化的应用程序界面。MVVM是一种软件编程模式,它将用户界面(UI)与业务逻辑分离,以便更好地实现可维护,可扩展和可组合的代码。Prism是一个WPF和Silverlight应用程序的组件库,它提供了一些可重用和可扩展的基础设施组件,帮助您更快速地构建、测试和维护WPF应用程序。因此,WPF MVVM Prism的组合可以帮助您更轻松高效地开发WPF应用程序。您可以使用MVVM模式来改进应用程序的结构和测试,使用Prism来更好地组织和可扩展您的代码,以及使用WPF来实现交互丰富的UI。同时还可以使用Prism提供的事件聚合器、导航器和模块化架构,实现更灵活的应用程序设计。WPF MVVM Prism的组合提供了一种更有效的方式来构建WPF应用程序,以满足现代用户体验的需求,并且更容易测试和维护,因此它已成为WPF应用程序开发的重要组合。
CSDN-Ada助手: 非常棒的博客!感谢分享这个关于用户自定义控件依赖属性的技术。希望你能进一步探索这个主题,比如介绍一些常见的Command绑定的实现方式,以及如何将控件的行为与ViewModel中的命令绑定起来。建议你写一篇《从零开始创建基于WPF的用户自定义控件(二):Command的绑定实现》的博文,这将会很有价值。期待你的下一篇博客! 2023年博客之星「城市赛道」年中评选已开启(https://activity.csdn.net/creatActivity?id=10470&utm_source=blog_comment_city ), 博主的原力值在所在城市已经名列前茅,持续创作就有机会成为所在城市的 TOP1 博主(https://bbs.csdn.net/forums/blogstar2023?typeId=3152981&utm_source=blog_comment_city),更有丰厚奖品等你来拿~。 未能加载文件或程序集“System.Windows.Interactivity问题的解决 m0_70186654: 我的是类库项目,删不删都不行,不知道什么问题 WPF 学生成绩管理工具开发笔记(14) ——工具效果演示(初版) windyhzy: 认真学习一下 C#使用IconFont字体图标的动态加载(&#xe格式转换) weixin_52086648: 什么垃圾还要开会员 WPF 为控件添加依赖属性和事件RoutedEvent #小楼一夜听风雨#: 本文对自定义控件事件的传递部分,写的非常清晰,感谢!受教了。