Silverlight 4 - Управление печатью - PullRequest
1 голос
/ 05 мая 2010

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

Как ни странно, когда я пытаюсь напечатать 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 печатаются по мере их отображения?

1 Ответ

2 голосов
/ 07 мая 2010

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

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

  • Измерьте количество элементов, отображаемых на странице
  • Создание визуальных элементов, которые показывают только элементы, которые вы хотите на этой странице
  • Передайте их в ваш "e.PageVisual"
  • Установите для e.HasMorePages значение true, пока вы не окажетесь на последней странице

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...