如何在 Metro 应用程序中打印 TextBox 的内容?我已经阅读了 MSDN 上的这个快速入门指南和许多在线教程,但是它们非常复杂并且不适用于 TextBox 控件,只能使用 RichTextBox控件。
我们如何从 Metro 应用程序中的 TextBox 控件进行打印?甚至可能吗?如何?
如何在 Metro 应用程序中打印 TextBox 的内容?我已经阅读了 MSDN 上的这个快速入门指南和许多在线教程,但是它们非常复杂并且不适用于 TextBox 控件,只能使用 RichTextBox控件。
我们如何从 Metro 应用程序中的 TextBox 控件进行打印?甚至可能吗?如何?
更新 1
我创建了一个帮助类来简化打印文本框内容。您可以通过NuGet添加助手类。如果你想增强我现有的帮助类,请在GitHub 上fork
在这里,我为您提供了MSDN 中修改后的打印示例。我已经放了文本框,你可以写任何东西并且会被打印出来。请注意,我没有完成打印文本框文本的示例,它与格式(粗体、斜体、下划线、颜色)完全相同。我设置了硬编码的打印格式。您可以制作自己的格式。
Stack Overflow 在回答中有字符限制,我的代码太长,所以发布 CodePaste.net 链接。
XAML:http ://codepaste.net/9nf261
CS:http ://codepaste.net/q3hsm3
请注意,我使用了一些图像,所以将图像放在“图像”文件夹中
我刚刚创建了一个带有文本框 (textBox1) 和一个按钮 (button1) 的小型 winforms 应用程序。代码隐藏如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void PrintDocumentOnPrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawString(this.textBox1.Text, this.textBox1.Font, Brushes.Black, 10, 25);
}
private void button1_Click(object sender, EventArgs e)
{
PrintDocument printDocument = new PrintDocument();
printDocument.PrintPage += PrintDocumentOnPrintPage;
printDocument.Print();
}
}
单击按钮即可完成打印。
我敦促你在这里检查我的问题在其中我说明了一种最简单的情况,在这种情况下您可以从页面上打印一些内容(并且您可以将该代码添加到您当前拥有的任何页面上 - 只需将我使用的示例文本框的文本替换为您想要的任何内容)。他们使用富文本框的原因是因为它可以检测到文本何时溢出页面,因此他们使用该信息与另一个富文本框创建一个新页面,直到不再发生溢出。无论如何,您可以使用自己的字符串解析器将文本拆分到不同的页面上。本质上,在 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$ 负责让我们挣扎的人打架。