8

我正在寻找一个如何从文件加载图像并使用 WPF 在页面上打印的示例。我很难找到有关 WPF 打印的好信息。

4

4 回答 4

26
var bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.UriSource = new Uri("");
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");
}
于 2008-11-05T13:41:46.117 回答
2

如果您想要更多控制,那么 PrintDialog.PrintVisual 让您必须将图像包装在 FixedDocumet 中。

您可以在此处找到创建固定文档的简单代码: http ://www.ericsink.com/wpf3d/B_Printing.html

于 2008-11-05T14:48:18.353 回答
1

只需加载图像并将其应用于视觉对象。然后使用 PrintDialog 来完成这项工作。

...
PrintDialog printer = new PrintDialog();

if (printer.ShowDialog()) {
  printer.PrintVisual(myVisual, "A Page Title");
}
于 2008-11-05T13:26:50.687 回答
1

确实在玩这个。

Tamir 的答案是一个很好的答案,但问题是,它使用的是图像的原始大小。


自己写一个解决方案,如果图像小于页面大小,则不会拉伸图像,如果图像在页面上太大,则将图像带入。
它可用于多份副本,并可用于两个方向。

                PrintDialog dlg = new PrintDialog();

            if (dlg.ShowDialog() == true)
            {
                BitmapImage bmi = new BitmapImage(new Uri(strPath));

                Image img = new Image();
                img.Source = bmi;

                if (bmi.PixelWidth < dlg.PrintableAreaWidth ||
                           bmi.PixelHeight < dlg.PrintableAreaHeight)
                {
                    img.Stretch = Stretch.None;
                    img.Width = bmi.PixelWidth;
                    img.Height = bmi.PixelHeight;
                }


                if (dlg.PrintTicket.PageBorderless == PageBorderless.Borderless)
                {
                    img.Margin = new Thickness(0);
                }
                else
                {
                    img.Margin = new Thickness(48);
                }
                img.VerticalAlignment = VerticalAlignment.Top;
                img.HorizontalAlignment = HorizontalAlignment.Left;

                for (int i = 0; i < dlg.PrintTicket.CopyCount; i++)
                {
                    dlg.PrintVisual(img, "Print a Large Image");
                }
            }

它目前仅适用于具有路径的文件中的图片,但只需稍加工作即可熟练使用它并仅传递 BitmapImage。
它可用于无边界打印(如果您的打印机支持它)


不得不使用 BitmapImage 的方式,因为它加载图像的默认大小。
如果您直接在那里加载图像,Windows.Controls.Image 不会显示正确的高度和宽度。


我知道,这个问题已经很老了,但是在搜索这个问题时很难找到一些有用的信息。
希望我的帖子对其他人有所帮助。

于 2020-08-12T20:50:18.943 回答