Win10/UWP新特性系列—使用打印机

Cle****-he UID.1073626
2015-12-10 发表

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备)添加基于XAML的App打印功能。使用Windows.Graphics.Printing和Windows.UI.Xaml.Printing命名空间,就可以很方便的将打印功能添加到我们的应用中。


下面是个例子,我们需要打印一个购物清单,前台代码如下:

[mw_shl_code=csharp,true]
<Page.Resources>
<SolidColorBrush x:Key="MainColor" Color="#0067a6"/>
<SolidColorBrush x:Key="LightColor" Color="#00abd8"/>
<SolidColorBrush x:Key="buttonColor" Color="#f29c9c"/>
</Page.Resources>
<Page.BottomAppBar>
<CommandBar>
<AppBarButton x:Name="appbar_Printer" Label="打印" Click="appbar_Printer_Click">
<AppBarButton.Icon>
<BitmapIcon UriSource="Images/Printer.png"/>
</AppBarButton.Icon>
</AppBarButton>
<AppBarButton Icon="Contact" Label="客服"/>
</CommandBar>
</Page.BottomAppBar>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel x:Name="sp_PrintArea">
<StackPanel HorizontalAlignment="Center">
<TextBlock Foreground="{StaticResource MainColor}" Text="购物清单"/>
</StackPanel>
<StackPanel >
<TextBlock Text="订单ID:G20150618094144234"/>
<Image Margin="0,6" Source="Images/surface pro 3.PNG" />
<TextBlock Margin="0,6" Text="商品名称:Surface Pro3 I7(8G 512G) 中国版"/>
<TextBlock Margin="0,6" Text="数量:1"/>
<TextBlock Margin="0,6" Text="单价:13,988¥"/>
<Rectangle Margin="0,6" Height="1" Fill="{StaticResource LightColor}"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center">
<TextBlock Foreground="{StaticResource MainColor}" Text="收货人信息"/>
</StackPanel>
<StackPanel >
<TextBlock Margin="0,6" Text="收货人:Aran"/>
<TextBlock Margin="0,6" Text="联系电话:186****0081"/>
<TextBlock Margin="0,6" Text="地址:地球村 中国小分队 xxx号"/>
</StackPanel>
</StackPanel>
</Grid>[/mw_shl_code]

需要用到的类:

◾ PrintManager:PrintManage 打印机管理器是负责为Windows应用程序安排打印流,使用时必须调用PrintManager.GetForCurrentView()方法来返回特定于当前窗口的PrintManager
◾ PrintDocument:PrintDocument 将打印流发送到打印机的一个可重用对象
◾ PrintTask:表示包括要打印的内容以及提供对描述将如何打印内容的信息的访问的打印操作
◾ PrintManager.PrintTaskRequested: 当发生打印的请求时,通过 ShowPrintUIAsync方法通过编程方式调用打印,或通过用户操作可能会触发此事件
◾ PrintTaskRequest. CreatePrintTask():创建打印任务
◾ PrintTask.Completed:打印完成事件
◾ PrintDocument.OnGetPreviewPage: 订阅打印预览事件
◾ PrintDocument.Paginate: 订阅预览时 打印参数发生变化事件 比如文档方向
◾ PrintDocument.AddPages: 添加页面处理事件
◾ PrintDocument.AddPage(UIElement pageVisual):添加打印页面,需要UI元素参数
◾ PrintDocument. SetPreviewPage():设置要预览的页面



后台代码实现:

[mw_shl_code=csharp,true]public sealed partial class MainPage : Page
{
/// <summary>
/// 使用PrintManage.GetForCurrentView()获取一个PrintManager对象
/// PrintManage 打印机管理器是负责为Windows应用程序安排打印流
/// 使用时必须调用PrintManager.GetForCurrentView()方法来返回特定于当前窗口的PrintManager
/// </summary>
PrintManager printmgr = PrintManager.GetForCurrentView();

/// <summary>
/// PrintDocument 将打印流发送到打印机的一个可重用对象
/// </summary>
PrintDocument printDoc = null;

/// <summary>
/// RotateTransform 是来旋转打印元素的,如果设备是横着的则需要旋转90°
/// </summary>
RotateTransform rottrf = null;

/// <summary>
/// 表示包括要打印的内容以及提供对描述将如何打印内容的信息的访问的打印操作
/// </summary>
PrintTask task = null;

public MainPage()
{
this.InitializeComponent();
//当发生打印的请求时,通过 ShowPrintUIAsync方法通过编程方式调用打印,或通过用户操作可能会触发此事件
printmgr.PrintTaskRequested += Printmgr_PrintTaskRequested;
}

private void Printmgr_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
{
//从参数的Request属性中获取与PrintTaskRequest的任务关联
//创建好打印内容和任务后 在调用Complete方法进行打印
var deferral = args.Request.GetDeferral();
// 创建打印任务
task = args.Request.CreatePrintTask("购物信息-打印单", OnPrintTaskSourceRequrested);
task.Completed += PrintTask_Completed;
deferral.Complete();
}

private void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args)
{
//打印完成
}

private async void OnPrintTaskSourceRequrested(PrintTaskSourceRequestedArgs args)
{
var def = args.GetDeferral();
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
() =>
{
// 设置打印源
args.SetSource(printDoc?.DocumentSource);
});
def.Complete();
}

private async void appbar_Printer_Click(object sender, RoutedEventArgs e)
{
if (printDoc != null)
{
printDoc.GetPreviewPage -= OnGetPreviewPage;
printDoc.Paginate -= PrintDic_Paginate;
printDoc.AddPages -= PrintDic_AddPages;
}
this.printDoc = new PrintDocument();
//订阅预览事件
printDoc.GetPreviewPage += OnGetPreviewPage;
//订阅预览时 打印参数发生变化事件 比如文档方向
printDoc.Paginate += PrintDic_Paginate;
//添加页面处理事件
printDoc.AddPages += PrintDic_AddPages;

// 显示打印对话框
bool showPrint = await PrintManager.ShowPrintUIAsync();
}

//添加打印页面的内容
private void PrintDic_AddPages(object sender, AddPagesEventArgs e)
{
//增加一个页要打印的元素
printDoc.AddPage(sp_PrintArea);

//完成对打印页面的增加
printDoc.AddPagesComplete();
}

private void PrintDic_Paginate(object sender, PaginateEventArgs e)
{
PrintTaskOptions opt = task.Options;
// 根据页面的方向来调整打印内容的旋转方向
switch (opt.Orientation)
{
case PrintOrientation.Default:
rottrf.Angle = 0d;
break;
case PrintOrientation.Portrait:
rottrf.Angle = 0d;
break;
case PrintOrientation.Landscape:
rottrf.Angle = 90d;
break;
}

// 设置预览页面的总页数
printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
}

private void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
{
// 设置要预览的页面
printDoc.SetPreviewPage(e.PageNumber, sp_PrintArea);
}
}[/mw_shl_code]


效果如下:

***图片停止解析***

本文出自:53078485群大咖Aran,欢迎您的加入

标签: 打印机

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
buzenm UID.992674
2015-12-10 回复

6666!

v****q UID.1035107
2015-12-10 回复

好代码感谢

q123hb UID.105020
2015-12-10 使用 Lumia 1520 回复

有意思

全****1 UID.1144163
2016-01-03 回复

66666

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报