2010-05-05 5 views
1

Je construis une application Silverlight 4. Cette application va imprimer le contenu d'un ItemsControl. Cette ItemsControl utilise un ItemTemplate pour rendre les éléments liés au contrôle. En tout, j'ai 500 objets qui sont liés au contrôle.Silverlight 4 - Print Items Control

Bizarrement, lorsque j'essaie d'imprimer le ItemsControl, il semble que celui-ci soit coupé après un certain point. Je ne peux pas dire quand il est coupé. Je sais juste que ça se coupe. J'ai l'impression que cela a quelque chose à voir avec la virtualisation. Cependant, je ne suis pas sûr de savoir comment surmonter cela. Actuellement, j'imprime le ItemsControl comme ceci:

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) 
{} 

Qu'est-ce que je fais mal? Comment puis-je m'assurer que tous les éléments de mon ItemsControl sont imprimés lorsqu'ils sont rendus?

+0

+1, Ceci est une très bonne question. – AnthonyWJones

+0

500 valeurs qui est plus qu'une page droite? Vous définissez la propriété HasMorePages sur true pour indiquer cela? – texmex5

Répondre

2

Les API d'impression ne paginent pas automatiquement les éléments dans ItemsControl pour vous. En outre, si vous imprimez quelque chose qui se trouve déjà dans l'arborescence visuelle, le résultat peut être tronqué pour correspondre à ce qui est affiché dans la fenêtre au moment de l'impression.

Pour imprimer plusieurs pages, vous devez:

  • mesure de comprendre le nombre d'éléments à afficher sur la page
  • créer des visuels qui ne montrent que les éléments que vous voulez sur cette page
  • les passer dans votre « e.PageVisual »
  • Set e.HasMorePages pour être vrai jusqu'à ce que vous êtes sur la dernière page

dans l'ensemble , cela peut être une bonne quantité de travail. Si vous essayez simplement d'imprimer un ItemsControl avec un ItemTemplate, vous devrez faire tout le travail ci-dessus. Pour les scénarios légèrement plus sophistiqués (par exemple, l'ajout de numéros de page, d'en-têtes/pieds de page, etc.), il y a encore plus de travail à faire. Cela dit, il est possible de construire une bibliothèque sur les simples API d'impression Silverlight qui font quelque chose comme ça. J'ai récemment blogué un contrôle destiné à traiter exactement ce scénario (ainsi que certains des plus sophistiqués).

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