web-dev-qa-db-fra.com

Comment imprimer le contenu d'une zone de texte

Comment imprimer le contenu d'une zone de texte dans les applications métropolitaines? J'ai lu ce guide de démarrage rapide sur MSDN et de nombreux tutoriels en ligne, mais ils sont très compliqués et ne fonctionnent pas avec les contrôles TextBox, uniquement RichTextBox, contrôles .

Comment pouvons-nous imprimer à partir d'un contrôle TextBox dans une application de métro? Est-ce même possible? Comment?

13
jay_t55

UPDATE 1

J'ai créé une classe d'assistance qui simplifie l'impression du contenu d'une zone de texte. Vous pouvez ajouter une classe d'assistance via NuGet . Si vous voulez améliorer ma classe d’aides existante, utilisez GitHub


Ici, je vous donne le échantillon d’impression modifié de MSDN. J'ai mis textbox vous pouvez écrire n'importe quoi et cela sera imprimé. Veuillez noter que je n’ai pas fait d’exemple qui imprime le texte de la zone de texte exactement de la même manière que c’est le formatage (gras, italique, souligné, couleurs). J'ai défini le format d'impression codé en dur. Vous pouvez créer votre propre format.

Le dépassement de pile a une limite de caractères dans la réponse et mon code est trop long, donc je poste des liens CodePaste.net.

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

CS: http://codepaste.net/q3hsm3

Veuillez noter que j'ai utilisé des images alors mettez les images dans le dossier "Images"

7
Xyroid

Je viens de créer une petite application winforms avec une zone de texte (textBox1) et un bouton (button1). Le code-behind ressemble à:

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

En un clic sur le bouton, l'impression sera faite. 

6
Tomtom

Je vous exhorte à vérifiez ma question ici dans laquelle je illustre un des cas les plus simples dans lequel vous pouvez imprimer quelque chose sur une page (et vous pouvez ajouter ce code sur n'importe quelle page que vous avez actuellement - il suffit de remplacer l'exemple texte de la boîte de texte que j'utilise pour tout ce que votre coeur désire). La raison pour laquelle ils utilisent les zones de texte enrichi est qu'ils détectent les débordements de texte de la page. Ils utilisent donc ces informations pour créer une nouvelle page avec une autre zone de texte enrichi jusqu'à ce qu'il n'y ait plus de débordement. Peu importe, vous pouvez utiliser votre propre analyseur de chaînes pour fractionner votre texte sur différentes pages. Essentiellement, l'impression dans les applications Windows 8 imprimera tout UIElement de votre choix. Vous pouvez donc pratiquement aligner votre page sur XAML et lui donner un style similaire à celui de n'importe quelle autre application Windows. Sérieusement, vérifiez la question, ce sera une aide énorme. J'ai passé des heures à pirater le PrintSample jusqu'au cas le plus simple avant de comprendre comment tout cela fonctionnait. Inutile de réinventer la roue, utilisez mes luttes à votre avantage, c'est ce que Stack est. À votre santé!

Edit: Je vais poser le code ici pour votre commodité, les gars.

Étape 1: Ajoutez ce code à la page avec votre zone de texte.

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

Étape 2: Remplacez block.Text avec votre texte souhaité.

Étape 3: Utilisez un bouton d'impression pour afficher l'interface utilisateur d'impression:

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

Étape 4: Mettez RequestedTheme = "Light" dans votre App.xaml et vous avez terminé. Remarque: vous pouvez éventuellement attribuer un style à la zone de texte comme vous le souhaitez dans cette classe XAML et ne pas avoir à définir le thème de l'application dans son ensemble.

Étape 5 (plus tard): Vous voudrez peut-être envisager d’ajouter à votre nouvelle logique de détection de page qui appelle régulièrement cette méthode pour créer une nouvelle page.

Étape 6 (maintenant): Engagez-vous dans le combat avec le type chez M $ qui est chargé de nous faire lutter.

0
Alexandru