2010-05-05 43 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 2010-05-05 15:50:01

+0

超過一頁的500個值是正確的?你確實將HasMorePages屬性設置爲true來表明這一點? – texmex5 2010-05-05 21:00:48

回答

2

打印API不會自動爲ItemsControl中的項目分頁。此外,如果要打印可視樹中已存在的內容,結果可能會被裁剪以與打印時窗口中呈現的內容相匹配。

要打印多個頁面,你需要:

  • 措施弄清楚有多少項目在頁面上展示
  • 創建的視覺效果,只有該網頁上顯示你想要的物品
  • 將它們傳遞到你的「e.PageVisual」
  • 設置e.HasMorePages直到你最後一頁

總而言之上是真實的,這可以是相當數量的工作。如果您只是試圖用ItemTemplate打印ItemsControl,則必須完成上述所有工作。對於稍微複雜的場景(例如添加頁碼,頁眉/頁腳等),還有更多工作要做。

也就是說,可以在簡單的Silverlight打印API上構建一個庫,它可以完成這樣的事情。我最近寫了一篇旨在解決這種情況的控件(以及一些更復雜的控件)。

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