2010-04-30 3 views
3

Мы приложение структурировано примерно так:Печать в Silverlight 4

<Grid x:Name="LayoutRoot"> 
    <ScrollViewer> 
<Canvas x:Name="canvas"> 
    <StackPanel> < Button /><Slider /><Button /></StackPanel> 
    <custom:Blob /> 
    <custom:Blob /> 
    <custom:Blob /> 
</Canvas> 
    </ScrollViewer> 
</Grid> 

Каждый Blob состоит из 1 или более прямоугольников, линий и текстовых полей; они расположены в любом месте на холсте.

Если я распечатать документ с помощью LayoutRoot:

PrintDocument pd = new PrintDocument(); 
pd += (s, pe) => { pe.PageVisual = LayoutRoot; }; 
pd.Print("Blobs"); 

... это как печать экрана - полосы прокрутки, ползунки, блобов, которые видны - печатаются.

Если я установил PageVisual = холст, ничего не печатается.

Как я могу получить все объекты blob и только те объекты, которые нужно распечатать? Нужно ли копировать их в другой контейнер и предоставить этот контейнер в PageVisual? Могу ли я использовать ViewBox, чтобы убедиться, что они все подходят на одной странице?

Спасибо за любые советы ....

ответ

2

Первая идея, которая пришла на ум, читая ваш пост был размер холста, который группирует ваши Blob объектов. Так нашел несколько интересных фрагментов, которые могут помочь вам:

В дополнение к спецификации UIElement, вы можете получить физический размер области печати с PrintPageEventArgs .. :: PrintableArea свойство.. Если UIElement превышает PrintableArea, контент будет , обрезанный в границах PrintableArea. Размеры области печати находятся на экранной основе пикселей.

и

Вы используете PrintPageEventArgs .. ::. HasMorePages свойства для печати документа с нескольких страниц. Значение по умолчанию для PrintPageEventArgs .. ::. HasMorePages - false, поэтому для одностраничных документов не нужно устанавливать . Однако, если существует несколько страниц для печати, вы должны указать PrintPageEventArgs .. ::. HasMorePages свойство true, чтобы указать, что есть дополнительные страницы для печати. Вы установили PrintPageEventArgs .. ::. HasMorePages Назад к false в событии PrintPage обработчик, когда последняя страница напечатана.

Documentation article

+0

Полезно, спасибо. Вероятно, есть способ указать область (прямоугольник) холста для печати ...? Или аналогично, в событии StartPrint, измените размер Canvas на минимальный ограничивающий прямоугольник для всех объектов, а затем восстановите его размер в событии EndPrint. Наконец, может ли ViewBox преобразовать холст, чтобы он помещался на одной странице? – Number8

+0

Я не уверен, у меня не было шанса попробовать это, но он должен что-то сделать, когда вы укажете, что у вас более 1 страницы, и содержимое не подходит. Но если это действительно ничего не значит, вам может понадобиться масштабировать холст группировки перед печатью, а затем позже масштабировать его, когда печать будет завершена. – texmex5

0

Вы можете применить масштаб tranform на LayoutRoot перед печатью.

Но я столкнулся с проблемой, когда LayoutRoot остается уменьшенным после печати. (Заданный вопрос here)

Смежные вопросы