2010-05-05 2 views
1

Я создаю приложение Silverlight 4. Это приложение опубликует содержимое элемента ItemsControl. Этот элемент ItemsControl использует ItemTemplate для визуализации элементов, привязанных к элементу управления. В целом у меня есть 500 элементов, связанных с элементом управления.Silverlight 4 - Элемент управления печатью

Как ни странно, когда я пытаюсь напечатать элемент ItemsControl, он кажется отрезанным после определенной точки. Я не могу сказать, когда он отключится. Я просто знаю, что он обрезается. У меня есть подозрение, что это связано с виртуализацией. Однако я не уверен, как это преодолеть. В настоящее время я печатаю ItemsControl следующим образом:

private void printHyperlink_Click(object sender, RoutedEventArgs e) 
{ 
    PrintDocument printDocument = new PrintDocument(); 
    printDocument.BeginPrint += 
    new EventHandler<BeginPrintEventArgs>(printDocument_BeginPrint); 
    printDocument.PrintPage += 
    new EventHandler<PrintPageEventArgs>(printDocument_PrintPage); 
    printDocument.EndPrint += 
    new EventHandler<EndPrintEventArgs>(printDocument_EndPrint); 

    printDocument.Print("My Items"); 
} 

void printDocument_BeginPrint(object sender, BeginPrintEventArgs e) 
{} 

void printDocument_PrintPage(object sender, PrintPageEventArgs e) 
{ e.PageVisual = myItemsControl; } 

void printDocument_EndPrint(object sender, EndPrintEventArgs e) 
{} 

Что я делаю неправильно? Как обеспечить, чтобы все элементы в моем ItemsControl были напечатаны, когда они отображаются?

+0

+1, Это очень хороший вопрос. – AnthonyWJones

+0

500 значений, которые больше, чем страницы справа? Вы устанавливаете для свойства HasMorePages значение true, чтобы указать это? – texmex5

ответ

2

API печати не автоматически разбивает элементы в ItemsControl для вас. Кроме того, если вы печатаете то, что уже находится в визуальном дереве, результат может быть обрезанным, чтобы соответствовать тому, что отображается в окне во время печати.

Для печати нескольких страниц, вам необходимо:

  • Меры, чтобы выяснить, сколько элементов показывать на странице
  • Создать визуальные эффекты, которые только показывают элементы, которые вы хотите на этой странице
  • Передайте их в «e.PageVisual»
  • Set e.HasMorePages, чтобы быть правдой до тех пор, пока вы на последней странице

всего , это может быть справедливая работа. Если вы просто пытаетесь напечатать элемент ItemsControl с помощью ItemTemplate, вам придется выполнить всю работу выше. Для более сложных сценариев (например, добавления номеров страниц, верхних и нижних колонтитулов и т. Д.) Требуется еще больше работы.

Это говорит о том, что возможно создание библиотеки через простые API-интерфейсы Silverlight, которые делают что-то вроде этого. Недавно я написал блог для управления именно таким сценарием (а также некоторыми более сложными).

http://www.davidpoll.com/2010/04/16/making-printing-easier-in-silverlight-4/

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