我有一個打印控件綁定到WPF中的數據的要求,我將有一個用戶控件,其中將有像網格綁定到數據的控件,我想打印用戶控件。我還需要支持分頁,頁眉和頁腳以及插入自定義徽標。打印控件綁定到WPF數據的指導
是否有任何文章/示例代碼可以幫助我入門。
我有一個打印控件綁定到WPF中的數據的要求,我將有一個用戶控件,其中將有像網格綁定到數據的控件,我想打印用戶控件。我還需要支持分頁,頁眉和頁腳以及插入自定義徽標。打印控件綁定到WPF數據的指導
是否有任何文章/示例代碼可以幫助我入門。
雖然向打印機發送視覺效果非常簡單,但如果需要處理分頁,縮放,頁眉和頁腳,它可能會更加複雜。但即使這並不是那麼困難,並且您可以通過編寫用戶xaml用戶控件來生成打印輸出。我喜歡這個printing overview on MSDN爲工作流程的一般圖片。
要執行分頁,您需要創建一個繼承自System.Windows.Documents.DocumentPaginator的類。通過該課程,您可以告訴打印機要打印哪些頁面以及每個頁面上的項目排列方式。
在paginator中,您將通過實例化要打印的用戶控件來編程式地構建您的頁面。如果你想要一個頁眉/頁腳,然後爲這些創建用戶控件,實例化它們,設置任何需要的DataContext屬性,並將它們添加到頁面中。在大多數情況下,您可以通過編程方式創建類似Grid的東西,配置列/行,爲其添加用戶控件,然後將其作爲可視化對象返回。
一招:你可能需要強制佈局系統來佈置控件。當你告訴它在屏幕上這是自動完成的,但如果你手動創建的東西,你需要做自己:
var pageSize = new Size(8.5 * 96.0, 11.0 * 96.0);
var pageRect = new Rect(new Point(0, 0), pageSize);
...
// create root visual (like a grid) and add user controls
...
root.Measure(pageSize);
root.Arrange(pageRect);
root.InvalidateVisual();
root.UpdateLayout();
在DocumentPaginator文檔解釋瞭如何使用類相當不錯。但對於分頁數據的情況,你可能需要自己做。我通常會確定頁面的大小以及我可以在該頁面上放置多少行。然後我編程地將數據分成多個集合。也許在每個集合中有25個項目。然後我將一個集合綁定到每個頁面的列表/網格。
最後,您需要將其發送給打印機。以下是我用來創建XPS文檔並將其發送到打印機的大致內容。並且...您可以使用這種變體輕鬆顯示打印預覽對話框。只需創建一個託管顯示XPS文檔的FixedDocumentViewer的對話框。
public static string Print(DocumentPaginator paginator, string printQueueName, string documentName)
{
using (MemoryStream xpsStream = new MemoryStream())
{
using (Package package = Package.Open(xpsStream, FileMode.Create, FileAccess.ReadWrite))
{
string packageUriString = "memorystream://data.xps";
Uri packageUri = new Uri(packageUriString);
try
{
PackageStore.AddPackage(packageUri, package);
using (XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.Maximum, packageUriString))
{
PrintTicket printTicket = new PrintTicket();
printTicket.PageMediaSize = new PageMediaSize(paginator.PageSize.Width, paginator.PageSize.Height);
var writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
writer.Write(paginator, printTicket);
FixedDocumentSequence document = xpsDocument.GetFixedDocumentSequence();
xpsDocument.Close();
PrintQueue targetQueue = null;
// Get the queue.
if (!string.IsNullOrEmpty(printQueueName))
{
var printServer = new LocalPrintServer();
targetQueue = printServer.GetPrintQueue(printQueueName);
}
// If no queue, then ask the user for a queue.
if (null == targetQueue)
{
var printDialog = new PrintDialog();
printDialog.PrintTicket = printTicket;
printDialog.UserPageRangeEnabled = false;
var response = printDialog.ShowDialog();
if (response.GetValueOrDefault() && null != printDialog.PrintQueue)
{
targetQueue = printDialog.PrintQueue;
}
else
{
return null;
}
}
var targetQueueWriter = PrintQueue.CreateXpsDocumentWriter(targetQueue);
document.Name = documentName;
targetQueueWriter.Write(document);
return document.Name;
}
}
finally
{
PackageStore.RemovePackage(packageUri);
}
}
}
}
什麼是根root.Measure()等?在他的」? – Boern