我该如何在Metro应用程序中打印文本框(TextBox)的内容?我已经阅读了MSDN上的快速入门指南和许多在线教程,但它们非常复杂并且无法使用TextBox控件,只能使用RichTextBox控件。
我们如何从Metro应用程序中的TextBox控件打印内容?是否可能?怎么做?
我该如何在Metro应用程序中打印文本框(TextBox)的内容?我已经阅读了MSDN上的快速入门指南和许多在线教程,但它们非常复杂并且无法使用TextBox控件,只能使用RichTextBox控件。
我们如何从Metro应用程序中的TextBox控件打印内容?是否可能?怎么做?
更新1
我创建了一个帮助类,简化了打印文本框内容的过程。你可以通过NuGet添加这个帮助类。如果你想增强我的现有帮助类,请在GitHub上进行分支。
这里我提供了来自MSDN的修改后的打印示例。我加入了一个文本框,你可以在里面写任何东西并将其打印出来。请注意,我没有编写完全与文本框文本相同的样式(粗体、斜体、下划线、颜色)的示例。我设置了硬编码的打印格式。你可以制作自己的格式。
Stack Overflow中的答案有字符限制,我的代码太长了,所以发布到了CodePaste.net上。
XAML : http://codepaste.net/9nf261
CS : http://codepaste.net/q3hsm3
请注意,我使用了一些图片,所以请将图片放在“Images”文件夹中。
PrintingRoot.Children.Add(page);
但我不知道为什么会有 null 值? - jay_t55我刚刚创建了一个小型的WinForms应用程序,其中包含一个文本框(textBox1)和一个按钮(button1)。代码如下:
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();
}
}
编辑:为了方便起见,我将在此处发布代码。
步骤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:使用打印按钮显示打印界面:
private async void PrintDocument(object sender, RoutedEventArgs e)
{
await Windows.Graphics.Printing.PrintManager.ShowPrintUIAsync();
}
第四步:将 RequestedTheme="Light" 放入你的 App.xaml 中,然后就完成了。注意:你也可以在这个 XAML 类中以另一种方式设置文本框样式,而不需要设置整个应用程序的主题。
第五步(稍后):你可能想考虑添加自己的新页面检测逻辑,以保持调用顶部的那个方法来创建一个新页面。
第六步(现在):与 M$ 上负责让我们挣扎的人发生冲突。