wake-up-neo.com

So drucken Sie den Inhalt eines TextBox

Wie drucke ich den Inhalt einer TextBox in Metro-Apps? Ich habe diese Kurzanleitung für MSDN und viele Online-Tutorials gelesen, aber sie sind sehr kompliziert und funktionieren nicht mit TextBox-Steuerelementen, nur RichTextBox Steuerelementen .

Wie drucken wir aus einem TextBox-Steuerelement in einer Metro-App? Ist es überhaupt möglich? Wie?

13
jay_t55

UPDATE 1

Ich habe eine Hilfsklasse erstellt, die das Drucken von Textfeldinhalten vereinfacht. Sie können über NuGet eine Hilfsklasse hinzufügen. Wenn Sie meine vorhandene Helper-Klasse erweitern möchten, gehen Sie auf GitHub


Hier gebe ich Ihnen das modifizierte Druckmuster aus MSDN. Ich habe in das Textfeld alles geschrieben und das wird gedruckt. Bitte beachten Sie, dass ich kein Muster erstellt habe, das Textbox-Text genau so ausgibt, wie er formatiert wurde (fett, kursiv, unterstrichen, Farben). Ich habe ein hart codiertes Druckformat eingestellt. Sie können Ihr eigenes Format erstellen.

Der Stapelüberlauf hat eine Zeichenbeschränkung und mein Code ist zu lang, so dass CodePaste.net-Links veröffentlicht werden.

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

CS: http://codepaste.net/q3hsm3

Bitte beachten Sie, dass ich einige Bilder verwendet habe, also Bilder im Ordner "Images" ablegen

7
Xyroid

Ich habe gerade eine kleine Winforms-Anwendung mit einem Textfeld (TextBox1) und einem Button (Button1) erstellt. Der Code-Behind sieht folgendermaßen aus:

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();
    }
}

Mit einem Klick auf die Schaltfläche wird der Druckvorgang abgeschlossen. 

6
Tomtom

Ich fordere Sie dazu auf, meine Frage hier zu überprüfen in dem ich einen der einfachsten Fälle illustriere, in dem Sie etwas von einer Seite drucken können (und Sie können den Code auf jeder Seite einfügen, die Sie gerade haben - ersetzen Sie einfach das Beispiel Textfeld des Textfelds verwende ich für das, was dein Herz will). Der Grund für die Verwendung der Rich-Text-Felder besteht darin, dass sie erkennen kann, wenn Text über die Seite hinausläuft. Daher verwenden sie diese Informationen, um eine neue Seite mit einem anderen Rich-Text-Feld zu erstellen, bis kein Überlauf mehr auftritt. Egal, Sie können Ihren eigenen String-Parser verwenden, um Ihren Text auf verschiedene Seiten aufzuteilen. Im Wesentlichen wird beim Drucken in Windows 8-Apps jedes gewünschte UIElement gedruckt, sodass Sie XAML so ziemlich programmgesteuert ausrichten und wie jede andere Windows-App gestalten können. Ernsthaft, überprüfe die Frage, es wird eine große Hilfe sein. Ich habe stundenlang das PrintSample auf den einfachsten Fall gehackt, bis ich herausgefunden habe, wie alles funktioniert hat. Es macht keinen Sinn, das Rad neu zu erfinden, nutze meine Kämpfe zu deinem Vorteil, darum geht es bei Stack. Prost!

Edit: Ich werde den Code hier für Ihre Bequemlichkeit aufstellen, Jungs.

Schritt 1: Fügen Sie diesen Code mit Ihrem Textfeld der Seite hinzu.

        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();
        }

Schritt 2: Ersetzen Sie block.Text durch Ihren gewünschten Text.

Schritt 3: Verwenden Sie eine Drucktaste, um die Druckbenutzeroberfläche anzuzeigen:

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

Schritt 4: Setzen Sie RequestedTheme = "Light" in Ihre App.xaml und Sie sind fertig. Hinweis: Möglicherweise können Sie das Textfeld alternativ so gestalten, wie Sie es in dieser XAML-Klasse wünschen, und muss nicht das Design der gesamten App festlegen.

Schritt 5 (später): Möglicherweise möchten Sie Ihre eigene neue Erkennungslogik hinzufügen, die diese Methode immer oben aufruft, um eine neue Seite zu erstellen.

Schritt 6 (recht jetzt): Kämpfen Sie mit dem Mann von M $, der dafür verantwortlich ist, dass wir uns mühen.

0
Alexandru