【发布时间】:2017-01-15 03:33:08
【问题描述】:
我想问一下如何打印我们自己的内容。例如,我们有一些表格,提交表格后,详细信息转到要打印的页面。然后打印。
我使用了来自https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/Printing/cs的示例。
但是当我尝试打印我的内容时,页面变成了空白页面。
我是 windows phone 开发和 c# 的新手。
【问题讨论】:
我想问一下如何打印我们自己的内容。例如,我们有一些表格,提交表格后,详细信息转到要打印的页面。然后打印。
我使用了来自https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/Printing/cs的示例。
但是当我尝试打印我的内容时,页面变成了空白页面。
我是 windows phone 开发和 c# 的新手。
【问题讨论】:
official sample 包含许多复杂的打印功能。直接替换样本的某些内容可能效果不佳。我在这里有一个可以满足打印要求的示例演示。并且只需将PrintArea Grid 中的内容替换为您自己的,示例可以打印您的内容。
XAML 代码
<Page.BottomAppBar>
<CommandBar>
<AppBarButton x:Name="appbar_Printer"
Click="appbar_Printer_Click"
Label="printer">
</AppBarButton>
</CommandBar>
</Page.BottomAppBar>
<Grid Background="White" x:Name="PrintArea" >
<TextBlock HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="36"
Foreground="Black"
Text="Welcome Printed World!" />
</Grid>
后面的代码:
PrintManager printmgr = PrintManager.GetForCurrentView();
PrintDocument printDoc = null;
PrintTask task = null;
public MainPage()
{
this.InitializeComponent();
printmgr.PrintTaskRequested += Printmgr_PrintTaskRequested;
}
private void Printmgr_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
{
var deferral = args.Request.GetDeferral();
task = args.Request.CreatePrintTask("Print", OnPrintTaskSourceRequrested);
//task.Completed += PrintTask_Completed;
PrintTaskOptionDetails printDetailedOptions = PrintTaskOptionDetails.GetFromPrintTaskOptions(task.Options);
deferral.Complete();
}
//private void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args)
//{
// //Completed
//}
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(this);
printDoc.AddPagesComplete();
}
private void PrintDic_Paginate(object sender, PaginateEventArgs e)
{
PrintTaskOptions opt = task.Options;
PrintTaskOptionDetails printDetailedOptions = PrintTaskOptionDetails.GetFromPrintTaskOptions(e.PrintTaskOptions);
printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
}
private void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
{
printDoc.SetPreviewPage(e.PageNumber, PrintArea);
}
如果您有更多要求,例如需要更多print options,请参考official document以及官方示例。
【讨论】: