在WPF 中可以通過PrintDialog 類方便的實現應用程序打印功能,本文將使用一個簡單實例進行演示。首先在VS中編輯一個圖形(如下圖所示)。
將需要打印的內容放入同一個<Canvas>中,並起名為“printArea”,打印按鍵一般不是我們希望打印出來的內容,則將其放在<Canvas>外面。
<Window x:Class="WpfPrint.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="500">
<Grid>
<Canvas x:Name="printArea">
<Ellipse Canvas.Left="137" Canvas.Top="92" Height="100" Stroke="Black" Width="200">
<Ellipse.Fill>
<LinearGradientBrush>
<GradientStop Color="#FFAD0FC7" Offset="0" />
<GradientStop Color="#FF3359AD" Offset="1" />
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<TextBlock FontSize="20" FontWeight="Bold" Foreground="White" Canvas.Left="151" Canvas.Top="129" Height="33"> Visual Studio 2010</TextBlock>
<Image Source="vs2010.jpg" Height="52" Width="90" Canvas.Left="388" Canvas.Top="0" />
</Canvas>
<Button Content="Print" Click="Button_Click" Height="23" Margin="195,268,190,20" />
</Grid>
</Window>
接下來編寫Button_Click 事件,由於我們要打印<Canvas>所包含的內容,所以要通過PrintVisual 打印Visual 對象。
private void Button_Click(object sender, RoutedEventArgs e) { PrintDialog dialog = new PrintDialog(); if (dialog.ShowDialog() == true) { dialog.PrintVisual(printArea, "Print Test"); } }
運行程序,點擊“Print”按鍵,彈出打印設置窗口,打印到XPS看看效果。
如下圖所示,打印結果中只有<Canvas>中的內容。
WPF 打印控件 無彈框打印
WPF中打印用到了 PrintDialog類。
其中設置打印屬性的是PrintTicket,管理打印機的是PrintQueue。
實例如下:
public class PrintDialogHelper { private const string PrintServerName = "YULIN-PC"; private const string PrintName = "HP LaserJet M1522 series PCL6 Class Driver"; public PrintDialogHelper() { } /// <summary>
/// 打印控件 /// </summary>
/// <param name="element"></param>
public void PrintVisual(FrameworkElement element) { var printDialog = new PrintDialog(); SetPrintProperty(printDialog); var printQueue = SelectedPrintServer(PrintServerName, PrintName); if (printQueue != null) { printDialog.PrintQueue = printQueue; printDialog.PrintVisual(element, ""); } } /// <summary>
/// 查找並獲取打印機 /// </summary>
/// <param name="printerServerName">服務器名字: Lee-pc</param>
/// <param name="printerName">打印機名字:Hp laserjet m1522 mfp series pcl 6 </param>
/// <returns></returns>
public PrintQueue SelectedPrintServer(string printerServerName, string printerName) { try { var printers = PrinterSettings.InstalledPrinters;//獲取本機上的所有打印機
PrintServer printServer = null; foreach (string printer in printers) { if (printer.Contains(printerName)) printServer = new PrintServer("\\\\" + printerServerName); } if (printServer == null) return null;//沒有找到打印機服務器
var printQueue = printServer.GetPrintQueue(printerName); return printQueue; } catch (Exception) { return null;//沒有找到打印機
} } /// <summary>
/// 設置打印格式 /// </summary>
/// <param name="printDialog">打印文檔</param>
/// <param name="pageSize">打印紙張大小 a4</param>
/// <param name="pageOrientation">打印方向 豎向</param>
public void SetPrintProperty(PrintDialog printDialog, PageMediaSizeName pageSize = PageMediaSizeName.ISOA4, PageOrientation pageOrientation = PageOrientation.Portrait) { var printTicket = printDialog.PrintTicket; printTicket.PageMediaSize = new PageMediaSize(pageSize);//A4紙
printTicket.PageOrientation = pageOrientation;//默認豎向打印
} }