如何打印文本框的内容

本文关键字:文本 何打印 打印 | 更新日期: 2023-09-27 18:05:28

如何在metro应用程序中打印文本框的内容?我已经在MSDN和许多在线教程上阅读了这个快速入门指南,但是它们非常复杂,不与TextBox控件一起工作,只有RichTextBox控件

我们如何从一个文本框控件在地铁应用程序打印?这可能吗?如何?

如何打印文本框的内容

UPDATE 1

我已经创建了一个帮助类,它简化了文本框内容的打印。你可以通过NuGet添加辅助类。如果你想增强我现有的助手类,在GitHub上分叉

这里我给你从MSDN修改打印样本。我放了一个文本框,你可以写任何东西,然后打印出来。请注意,我没有做样本打印文本框文本完全相同,因为它是即格式(粗体,斜体,下划线,颜色)。我已经设置了硬编码打印格式。你可以创建自己的格式。

Stack Overflow在答案中有字符限制,我的代码太长,所以张贴CodePaste.net链接。

XAML: http://codepaste.net/9nf261

CS: http://codepaste.net/q3hsm3

请注意,我使用了一些图片,所以把图片放在" images "文件夹

我刚刚创建了一个带有文本框(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应用程序中打印可以打印任何你想要的元素,所以你可以用编程的方式对你的页面进行XAML对齐,并对其进行样式设置,就像你对其他Windows应用程序进行样式设置一样。我花了几个小时破解PrintSample,直到弄清楚它是如何工作的。没有必要重新发明轮子,把我的挣扎变成你的优势,这就是斯塔克的意义所在。干杯!

编辑:为了你们的方便,我把代码放在这里。

步骤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:替换块。Text with your desired Text .

步骤3:使用打印按钮显示打印UI:

        private async void PrintDocument(object sender, RoutedEventArgs e)
        {
            await Windows.Graphics.Printing.PrintManager.ShowPrintUIAsync();
        }

步骤4:把requestdtheme ="Light"放到你的App.xaml中,你就完成了。注:也许可以选择样式文本框的方式,你想在这个XAML类,而不必设置整个应用程序的主题。

步骤5(稍后):您可能想要考虑添加您自己的新页面检测逻辑,该逻辑一直向上调用该方法以创建新页面。

第六步(现在):和M$的那个让我们挣扎的家伙打一架