web-dev-qa-db-ja.com

TextBoxの内容を印刷する方法

メトロアプリでTextBoxのコンテンツを印刷するにはどうすればよいですか?私は MSDNのこのクイックスタートガイド と多くのオンラインチュートリアルを読みましたが、それらは非常に複雑で、TextBoxコントロールでは機能しませんのみRichTextBoxコントロール

メトロアプリのTextBoxコントロールからどのように印刷しますか?それも可能ですか?どうやって?

14
jay_t55

UPDATE 1

テキストボックスのコンテンツの印刷を簡素化するヘルパークラスを作成しました。 NuGet を介してヘルパークラスを追加できます。既存のヘルパークラスを拡張したい場合は、フォークして GitHub


ここでは、MSDNから 変更された印刷サンプル を提供します。私はあなたが何でも書くことができるテキストボックスを置きました、そしてそれは印刷されます。テキストボックスのテキストをフォーマットとまったく同じように印刷するサンプル(太字、斜体、下線、色)を作成していないことに注意してください。ハードコードされた印刷形式を設定しました。あなたはあなた自身のフォーマットを作ることができます。

Stack Overflowの回答には文字数制限があり、コードが長すぎるため、CodePaste.netリンクを投稿してください。

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

CS: http://codepaste.net/q3hsm

一部の画像を使用しているので、「画像」フォルダに画像を入れてください。

7
Xyroid

テキストボックス(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();
    }
}

ボタンをクリックすると、印刷が行われます。

6
Tomtom

ここで私の質問を確認してください ここでは、ページから何かを印刷できる(そして、現在ある任意のページにそのコードを追加できる)最も単純なケースの1つを示しています。私があなたの心が望むものに使用するテキストボックスのテキストの例)。リッチテキストボックスを使用する理由は、テキストがページからオーバーフローしたことを検出できるため、オーバーフローが発生しなくなるまで、その情報を使用して別のリッチテキストボックスで新しいページを作成するためです。関係なく、独自の文字列パーサーを使用して、テキストを別のページに分割できます。基本的に、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 $の男と戦います。

0
Alexandru