效果如圖
打印結果
private string outputDic { get { return $"{AppDomain.CurrentDomain.BaseDirectory}\\Temp\\"; } }
private void PrintImage(object sender, RoutedEventArgs e)
{
//將控件imageBorder的畫面輸出圖片
var outputPath = GetPicFromControl(imageBorder as FrameworkElement);
//打印
Print(outputPath);
//刪除圖片
File.Delete(outputPath);
}
private string GetPicFromControl(FrameworkElement element)
{
//96為顯示器DPI
double dpiX = 96;
double dpiY = 96;
var bitmapRender = new RenderTargetBitmap((int)element.ActualWidth, (int)element.ActualHeight, dpiX, dpiY, PixelFormats.Pbgra32);//位圖 寬度 高度 水平DPI 垂直DPI 位圖的格式 高度+100保證整個圖都能截取
//控件內容渲染RenderTargetBitmap
bitmapRender.Render(element);
BitmapEncoder encoder = new JpegBitmapEncoder();
var outputPath = $"{outputDic}\\{Guid.NewGuid().ToString()}.jpg";
//對於一般的圖片,只有一幀,動態圖片是有多幀的。
encoder.Frames.Add(BitmapFrame.Create(bitmapRender));//添加圖
if (!Directory.Exists(System.IO.Path.GetDirectoryName(outputPath)))
Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath));
using (var file = File.Create(outputPath))//存儲文件
encoder.Save(file);
return outputPath;
}
private void Print(string outputPath)
{
try
{
this.Cursor = Cursors.Wait;
var bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
//加載圖片
bi.UriSource = new Uri(outputPath);
bi.EndInit();
var vis = new DrawingVisual();
using (var dc = vis.RenderOpen())
{
dc.DrawImage(bi, new Rect { Width = bi.Width, Height = bi.Height });
}
var pdialog = new PrintDialog();
if (pdialog.ShowDialog() == true)
{
pdialog.PrintVisual(vis, "My Image");
}
}
finally
{
this.Cursor = Cursors.AppStarting;
}
}
打印表單,參考用WPF實現打印及打印預覽
打印圖片的思路是將控件的畫面保存為圖片->打印圖片
打印表單的思路是xaml模板+數據->打印表單
示例代碼
PrintImage
打印表單的代碼PrintTable