it-swarm.com.ru

Как распечатать содержимое TextBox

Как мне распечатать содержимое TextBox в приложениях метро? Я прочитал это краткое руководство по MSDN и многие онлайн-учебники, но они очень сложны и не работают с элементами управления TextBox, только RichTextBox control.

Как распечатать из элемента управления TextBox в приложении метро? Это вообще возможно? Как?

13
jay_t55

ОБНОВЛЕНИЕ 1

Я создал вспомогательный класс, который упрощает печать содержимого текстового поля. Вы можете добавить вспомогательный класс через NuGet . Если вы хотите улучшить мой существующий вспомогательный класс, включите GitHub


Здесь я даю вам модифицированный образец печати из MSDN. Я поставил текстовое поле, вы можете написать все, что будет напечатано. Обратите внимание, что я не сделал образец, который печатает текст текстового поля точно так же, как и форматирование (полужирный, курсив, подчеркивание, цвета). Я установил жестко заданный формат печати. Вы можете сделать свой собственный формат.

Переполнение стека имеет ограничение по количеству символов в ответе, и мой код слишком длинный, поэтому я публикую ссылки CodePaste.net.

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

CS: http://codepaste.net/q3hsm3

Обратите внимание, что я использовал некоторые изображения, поэтому поместите изображения в папку «Изображения»

7
Xyroid

Я только что создал небольшое 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();
    }
}

При нажатии на кнопку печать будет завершена. 

6
Tomtom

Я призываю вас проверить мой вопрос здесь в котором я иллюстрирую один из самых простых случаев, когда вы можете напечатать что-то со страницы (и вы можете добавить этот код на любую страницу, которая у вас есть в данный момент - просто замените пример текстового поля текст, который я использую для всего, что душе угодно). Причина, по которой они используют поля расширенного текста, заключается в том, что он может определять переполнение текста за пределами страницы, поэтому они используют эту информацию для создания новой страницы с другим полем расширенного текста до тех пор, пока больше не произойдет переполнение. Неважно, вы можете использовать свой собственный анализатор строк, чтобы разделить ваш текст на разные страницы. По сути, печать в приложениях Windows 8 будет печатать любой элемент UIE, который вы хотите, так что вы можете в значительной степени XAML выровнять свою страницу программно и стилизовать ее так же, как стиль любого другого приложения Windows. Серьезно, проверьте вопрос, это будет огромная помощь. Я потратил часы на взлом PrintSample до самого простого случая, пока не понял, как все это работает. Нет смысла заново изобретать колесо, используй мою борьбу в своих интересах, вот что такое Stack. Ура!

Edit: я поставлю код здесь для вашего удобства, ребята.

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

Шаг 4. Поместите RequestedTheme = "Light" в свой App.xaml, и все готово. Примечание. Может иметь альтернативную стилизацию текстового поля так, как вы этого хотите в этом классе XAML, и вам не нужно устанавливать тему всего приложения.

Шаг 5 (позже): Вы можете рассмотреть возможность добавления в свою собственную логику обнаружения новой страницы, которая продолжает вызывать этот метод, чтобы создать новую страницу.

Шаг 6 (Прямо сейчас): вступайте в борьбу с парнем из M $, который отвечает за то, чтобы заставить нас бороться.

0
Alexandru