Я пытаюсь напечатать главное окно как для принтера, так и для файла (с помощью PrintDialog). Я пробовал следующие три решения, но есть проблемы с каждым из них (объясняется ниже). Кто-нибудь знает о хорошем решении или может улучшить существующие?Как распечатать окно (или экран) с помощью PrintDialog (или эквивалентного)?
Это решение сокращает окончательный документ/печать, так что отображается не на весь экран.
private void PrintBitmapSource(BitmapSource inBms)
{
var pd = new PrintDialog();
var ret = pd.ShowDialog();
if (ret.Value)
{
var dv = new DrawingVisual();
using (var dc = dv.RenderOpen())
{
dc.DrawImage(inBms, new Rect(0, 0, inBms.Width, inBms.Height));
}
pd.PrintVisual(dv, "document image");
}
}
2. http://www.a2zdotnet.com/View.aspx?id=66#.VcMld_ntlBc
Это решение создает полную печать, но есть какие-то странные артефакты, где она кажется смешивать элементы до и после изменения размера. Также изменяет размер экрана.
PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
if (printDlg.ShowDialog() == true)
{
//get selected printer capabilities
System.Printing.PrintCapabilities capabilities = printDlg.PrintQueue.GetPrintCapabilities(printDlg.PrintTicket);
//get scale of the print wrt to screen of WPF visual
double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth/this.ActualWidth, capabilities.PageImageableArea.ExtentHeight/
this.ActualHeight);
//Transform the Visual to scale
this.LayoutTransform = new ScaleTransform(scale, scale);
//get the size of the printer page
Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
//update the layout of the visual to the printer page size.
this.Measure(sz);
this.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));
//now print the visual to printer to fit on the one page.
printDlg.PrintVisual(this, "First Fit to Page WPF Print");
}
3. Установка PageMediaSize разрешению экрана (жестко закодированы для целей тестирования).
Это решение почти идеально, но имеет область справа, которая является черной, но некоторые элементы отображаются правильно поверх этой черной области. Может показаться, что черная область начинается там, где разрешено решение №1.
var pd = new System.Windows.Controls.PrintDialog();
var ret = pd.ShowDialog();
if (ret.Value)
{
pd.PrintTicket.PageMediaSize = new PageMediaSize(1920, 1080);
pd.PrintTicket.PageOrientation = System.Printing.PageOrientation.Landscape;
pd.PrintVisual(ApplicationGlobal.MainWindow as Window, "testprint");
}
Спасибо, но это не то, что я ищу. Я хочу напечатать изображение на принтере, используя PrintDialog (или эквивалент). Отредактировано название, чтобы избежать путаницы. – Godspark
Он показывает другой способ визуализации, который затем можно использовать для печати. Вероятно, ваша проблема связана с использованием PrintDialog.PrintVisual. Вы можете попробовать выполнить рендеринг с помощью RenderTargetBitmap, а затем распечатать растровое изображение. –
Что именно следует вводить для метода printDialog.PrintVisual()? – Godspark