Как распечатать содержимое TextBox
Как распечатать содержимое TextBox в приложениях метро? Я прочитал это руководство по быстрому запуску в MSDN и много онлайн-руководств, но они очень сложны и не работают с элементами управления TextBox, только элементы управления RichTextBox.
Как мы печатаем из элемента управления TextBox в приложении метро? Возможно ли это? Как?
Ответы
Ответ 1
ОБНОВЛЕНИЕ 1
Я создал вспомогательный класс, который упрощает печать текстового поля. Вы можете добавить вспомогательный класс через NuGet. Если вы хотите улучшить мой существующий класс-помощник, fork на GitHub
Здесь я даю вам измененный образец печати из MSDN. Я поставил текстовое поле, которое вы можете написать, и оно будет напечатано. Обратите внимание, что я не сделал образец, который печатает текст текстового поля точно так же, как и форматирование (жирный, курсив, подчеркивание, цвета). Я установил жесткий формат печати. Вы можете создать свой собственный формат.
Переполнение стека имеет ограничение по символу в ответе, а мой код слишком длинный, поэтому вы отправляете ссылки на CodePaste.net.
XAML: http://codepaste.net/9nf261
CS: http://codepaste.net/q3hsm3
Обратите внимание, что я использовал некоторые изображения, поэтому помещал изображения в папку "Изображения"
Ответ 2
Я только что создал небольшое 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();
}
}
При щелчке по кнопке печать будет выполнена.
Ответ 3
Я призываю вас проверить мой вопрос здесь, в котором я иллюстрирую один из самых простых случаев, когда вы можете распечатать что-то на странице (и вы можете добавить этот код на любую страницу, которую вы сейчас используете, - просто замените текст текстового поля примера, который я использую, независимо от того, что желает ваше сердце). Причина, по которой они используют богатые текстовые поля, заключается в том, что он может обнаруживать, когда текст переполняется со страницы, поэтому они используют эту информацию для создания новой страницы с другим богатым текстовым полем, пока не произойдет больше переполнения. Независимо от того, вы можете использовать собственный синтаксический анализатор для разделения текста на разных страницах. По сути, печать в приложениях Windows 8 будет печатать любой UIElement, который вы хотите, так что вы можете в значительной степени выровнять свою страницу по своему усмотрению и стилизовать ее так же, как и в любом другом приложении 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: Замените block.Text на нужный текст.
Шаг 3: Используйте кнопку печати, чтобы отобразить интерфейс печати:
private async void PrintDocument(object sender, RoutedEventArgs e)
{
await Windows.Graphics.Printing.PrintManager.ShowPrintUIAsync();
}
Шаг 4: Поместите RequestedTheme = "Свет" в ваш App.xaml, и все готово. Примечание. Возможно, вы сможете альтернативно стилизовать текстовое поле так, как вы хотите, в этом классе XAML и не задавать тему всего приложения.
Шаг 5 (позже): вы можете захотеть добавить в свою собственную новую логику обнаружения страницы, которая продолжает называть этот метод вверху, чтобы создать новую страницу.
Шаг 6 (прямо сейчас): Вступайте в бой с парнем в M $, который несет ответственность за то, что мы пытаемся бороться.