我敦促您使用check my question here,其中我说明了一种最简单的情况,在这种情况下您可以从页面上打印某些内容(并且您可以将该代码添加到您当前拥有的任何页面上 - 只需替换示例文本框的文本 I随心所欲地使用)。他们使用富文本框的原因是因为它可以检测到文本何时溢出页面,因此他们使用该信息与另一个富文本框创建一个新页面,直到不再发生溢出。无论如何,您可以使用自己的字符串解析器将文本拆分到不同的页面上。本质上,在 Windows 8 应用程序中打印将打印您想要的任何 UIElement,因此您几乎可以通过 XAML 以编程方式对齐您的页面,并按照您为任何其他 Windows 应用程序设置样式的方式来设置它的样式。说真的,检查问题,这将是一个巨大的帮助。我花了几个小时将 PrintSample 破解为最简单的情况,直到我弄清楚它是如何工作的。重新发明轮子没有意义,利用我的努力为您服务,这就是 Stack 的全部意义所在。干杯!
编辑:为了您的方便,我将代码放在这里,伙计们。
第 1 步:将此代码添加到带有文本框的页面。
protected PrintDocument printDocument = null;
protected IPrintDocumentSource printDocumentSource = null;
internal List<UIElement> printPreviewElements = new List<UIElement>();
protected event EventHandler pagesCreated;
protected void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs e)
{
PrintTask printTask = null;
printTask = e.Request.CreatePrintTask("C# Printing SDK Sample", sourceRequested =>
{
printTask.Completed += async (s, args) =>
{
if (args.Completion == PrintTaskCompletion.Failed)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
MessageDialog dialog = new MessageDialog("Something went wrong while trying to print. Please try again.");
await dialog.ShowAsync();
});
}
};
sourceRequested.SetSource(printDocumentSource);
});
}
protected void RegisterForPrinting()
{
printDocument = new PrintDocument();
printDocumentSource = printDocument.DocumentSource;
printDocument.Paginate += CreatePrintPreviewPages;
printDocument.GetPreviewPage += GetPrintPreviewPage;
printDocument.AddPages += AddPrintPages;
PrintManager printMan = PrintManager.GetForCurrentView();
printMan.PrintTaskRequested += PrintTaskRequested;
}
protected void UnregisterForPrinting()
{
if (printDocument != null)
{
printDocument.Paginate -= CreatePrintPreviewPages;
printDocument.GetPreviewPage -= GetPrintPreviewPage;
printDocument.AddPages -= AddPrintPages;
PrintManager printMan = PrintManager.GetForCurrentView();
printMan.PrintTaskRequested -= PrintTaskRequested;
}
}
protected void CreatePrintPreviewPages(object sender, PaginateEventArgs e)
{
printPreviewElements.Clear();
PrintTaskOptions printingOptions = ((PrintTaskOptions)e.PrintTaskOptions);
PrintPageDescription pageDescription = printingOptions.GetPageDescription(0);
AddOnePrintPreviewPage(pageDescription);
if (pagesCreated != null)
{
pagesCreated.Invoke(printPreviewElements, null);
}
((PrintDocument)sender).SetPreviewPageCount(printPreviewElements.Count, PreviewPageCountType.Intermediate);
}
protected void GetPrintPreviewPage(object sender, GetPreviewPageEventArgs e)
{
((PrintDocument)sender).SetPreviewPage(e.PageNumber, printPreviewElements[e.PageNumber - 1]);
}
protected void AddPrintPages(object sender, AddPagesEventArgs e)
{
foreach (UIElement element in printPreviewElements)
{
printDocument.AddPage(element);
}
((PrintDocument)sender).AddPagesComplete();
}
protected void AddOnePrintPreviewPage(PrintPageDescription printPageDescription)
{
TextBlock block = new TextBlock();
block.Text = "This is an example.";
block.Width = printPageDescription.PageSize.Width;
block.Height = printPageDescription.PageSize.Height;
printPreviewElements.Add(block);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
RegisterForPrinting();
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
UnregisterForPrinting();
}
第 2 步:将 block.Text 替换为您想要的文本。
第 3 步:使用打印按钮显示打印 UI:
private async void PrintDocument(object sender, RoutedEventArgs e)
{
await Windows.Graphics.Printing.PrintManager.ShowPrintUIAsync();
}
第 4 步:将 RequestedTheme="Light" 放入您的 App.xaml 中,您就完成了。注意:也许可以在此 XAML 类中按照您想要的方式设置文本框的样式,而不必设置整个应用程序的主题。
第 5 步(稍后):您可能需要考虑添加自己的新页面检测逻辑,该逻辑会不断调用该方法以创建新页面。
第 6 步(现在):与 M$ 负责让我们陷入困境的人打架。