Silverlight - Печать
Печать - важная возможность для определенных типов приложений. В этой главе мы рассмотрим соответствующие возможности Silverlight.
API печати и основные шаги, которые все приложения Silverlight должны выполнить, если они хотят печатать. Различные варианты выбора водной печати.
Самый простой - распечатать копию элементов пользовательского интерфейса, которые уже находятся на экране.
Большинство приложений захотят стать немного более продвинутыми, чем это, и генерировать контент, адаптированный специально для печати, и в некоторых случаях будет необходимо разделить контент на несколько страниц.
Шаги для печати
Независимо от того, печатаете ли вы снимок или что-то, что уже отображается на экране, или собираетесь для полностью настраиваемого многостраничного вывода на печать, требуются одни и те же основные шаги.
В основе API печати лежит класс PrintDocument.
Вы начинаете с создания одного из них, и когда вы вызываете его метод Print, он показывает стандартный пользовательский интерфейс для запуска задания печати.
Пользователь может выбрать принтер и настроить параметры как обычно. Если затем пользователь решит продолжить, нажавPrint, то PrintDocument немедленно поднимет PrintPage событие, и ваш обработчик для этого события предоставляет содержимое для печати.
Аргумент события предлагает PageVisual имущество для этой цели.
Вы можете установить его для любого элемента пользовательского интерфейса Silverlight, будь то тот, который уже отображается на экране, или новый, который вы создали специально для печати.
Печать существующих элементов
Элементы Самый простой вариант - распечатать содержимое, которое уже отображается на экране вашего приложения Silverlight. ПосколькуPrintPage аргументы события PageVisual, принимает любые элементы пользовательского интерфейса, вы можете выбрать что угодно в своем пользовательском интерфейсе и распечатать его.
Это лишь небольшой шаг вперед от использования клавиши PrintScreen для создания снимка экрана. Это немного лучше, потому что пользователю не нужно вручную вставлять снимок экрана в какую-либо другую программу, чтобы обрезать его и распечатать. Это пока лишь небольшое улучшение.
Печать контента, который уже отображается на экране, проблематична.
Прежде всего, нет никакой гарантии, что макет, который работает на экране, подойдет для бумаги.
Давайте посмотрим на простой пример, в котором ScrollViewerсодержит некоторые элементы пользовательского интерфейса и его макет, адаптированный для экрана. Он изменяется в зависимости от размера окна браузера и предлагает полосы прокрутки, чтобы все было доступно, даже если оно не подходит.
Ниже приведен код XAML.
<UserControl
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk = "http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
x:Class = "SilverlightPrinting.MainPage"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "500">
<Grid x:Name = "LayoutRoot" Background = "White">
<Button x:Name = "print" Content = "Print" Click = "print_Click" Width = "60"
Height = "20" Margin = "10,10,430,270"/>
<ScrollViewer x:Name = "myScrollViewer"
HorizontalScrollBarVisibility = "Auto"
VerticalScrollBarVisibility = "Auto"
Width = "400" Margin = "90,0,10,0">
<StackPanel>
<Rectangle Fill = "Gray" Width = "100" Height = "100" />
<Button x:Name = "button" Content = "Button" Width = "75"/>
<sdk:Calendar Height = "169" Width = "230"/>
<Rectangle Fill = "AliceBlue" Width = "475" Height = "100" />
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
Здесь Print button реализация события щелчка, которая распечатает ScrollViewer и его видимые данные.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Printing;
namespace SilverlightPrinting {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void print_Click(object sender, RoutedEventArgs e) {
PrintDocument pd = new PrintDocument();
pd.PrintPage += new System.EventHandler<PrintPageEventArgs>(pd_PrintPage);
pd.Print("Print Screen Content");
}
private void pd_PrintPage(object sender, PrintPageEventArgs e) {
e.PageVisual = myScrollViewer;
}
}
}
Как видите, в Print button click event тот PrintDocument объект создан, мы прикрепляем обработчик к его событию PrintPage.
Вы можете установить PageVisual свойство ссылаться на ScrollViewer.
потом Print methodназывается. Это принимает строку, которая будет отображаться как имя задания в очереди печати.
Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий результат.
Когда вы нажимаете Print , вы увидите стандартный диалог печати.
Теперь выберите принтер по умолчанию. Для демонстрации выберемOneNote и щелкните Printкнопка. Вы увидите этоScrollViewer печатается.
Обратите внимание, что полосы прокрутки все еще видны на ScrollViewer.
Пользовательское дерево пользовательского интерфейса
Вместо того, чтобы печатать контент, который уже отображается на экране, обычно имеет смысл построить дерево элементов пользовательского интерфейса специально для печати. Таким образом, вы можете быть уверены, что используете на бумаге только неинтерактивные элементы, и можете создать специальный макет, который лучше подходит для формы и размера бумаги. Вы можете создать UserControl только для печати.
Давайте посмотрим на простой пример, создав проект Silverlight и добавив UserControl называется PrintLayout.
Установите ширину и высоту времени дизайна примерно по форме бумаги. Ниже приведен код XAML дляPrintLayout.xaml файл.
<UserControl x:Class = "PrintCustomUI.PrintLayout"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "768" d:DesignWidth = "960">
<Grid x:Name = "LayoutRoot" Background = "White">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
<RowDefinition />
<RowDefinition Height = "Auto" />
</Grid.RowDefinitions>
<TextBlock Text = "Silverlight" HorizontalAlignment = "Center"
FontSize = "60" FontWeight = "Bold" FontFamily = "Georgia" />
<TextBlock Grid.Row = "2" Text = "Print Testing"
HorizontalAlignment = "Center" FontFamily = "Georgia"
FontSize = "24" Margin = "0,10"/>
<Rectangle Grid.Row = "2" Height = "1" Fill = "Black"
VerticalAlignment = "Top"/>
<Ellipse Grid.Row = "1" Stroke = "Black" StrokeThickness = "10" Margin = "10">
<Ellipse.Fill>
<RadialGradientBrush
GradientOrigin = "0.2,0.2"
Center = "0.4,0.4">
<GradientStop Color = "Aqua" Offset = "0.006" />
<GradientStop Color = "AntiqueWhite" Offset = "1" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
</UserControl>
Ниже приведен код в MainPage.xaml файл, содержащий Print только кнопка.
<UserControl x:Class = "PrintCustomUI.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<Button Content = "Print..." Height = "23" HorizontalAlignment = "Left"
Margin = "12,28,0,0" Name = "printButton"
VerticalAlignment = "Top" Width = "75"
Click = "printButton_Click" />
</Grid>
</UserControl>
Здесь Click event реализация для кнопки печати.
using System;
using System.Collections.Generic;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Printing;
namespace PrintCustomUI {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void printButton_Click(object sender, RoutedEventArgs e) {
PrintDocument pd = new PrintDocument();
pd.PrintPage += new EventHandler<PrintPageEventArgs>(pd_PrintPage);
pd.Print("Custom");
}
void pd_PrintPage(object sender, PrintPageEventArgs e) {
var pl = new PrintLayout();
pl.Width = e.PrintableArea.Width;
pl.Height = e.PrintableArea.Height;
e.PageVisual = pl;
}
}
}
Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод на веб-странице.
Нажмите Print и выберите OneNoteраспечатать макет. Вы увидите, что макет распечатан.
Вы можете видеть, что он заполнил доступное пространство. Мы рекомендуем вам выполнить приведенные выше примеры для лучшего понимания.