4

我想打印添加到 Winform 应用程序的 WPF 控件(MapControl)的可视内容。

(基本上,用任何控件编译一个 WPF 用户控件,然后像任何其他控件一样将生成的控件添加到您的 Winform 项目中。)

另一个用户基本上给出了一些代码来完成打印部分。请参阅: http: //www.devexpress.com/Support/Center/Question/Details/Q386207

我可以在 Winform 端收集的代码应该是:

private PrintDocument m_oPrintDoc;
public frmWhatever()
    : base()
{
    // This call is required by the Windows Form Designer.
    InitializeComponent();

    // Set up the printing
    m_oPrintDoc = new PrintDocument();
    m_oPrintDoc.PrintPage += PrintDoc_PrintPage;
}

void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    e.PageVisual = MapContainer;
}

问题是 Winform 端不存在 PageVisual。它显然在 WPF 中。

什么是等效代码?我对“MapContainer”部分没有任何问题。唯一缺少的成分是“e.what”方法?

如果我添加引用/使用对,PageVisual 是否可能存在?

在有人要求我联系 DevExpress 之前,我已经尝试过了。他们的回答是,这个问题与他们没有任何关系,是一个纯粹的 Microsoft.Net 问题,因此这里提出了问题。

哦,是的,我正在使用带有 .Net 4.5 的 Visual Studio 2012。

4

2 回答 2

1

您正在使用 GDI 在 WinForms 中打印。

您的代码应如下所示(未经测试):

void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    var bmp = new Bitmap(e.MarginBounds);
    MapContainer.DrawToBitmap(bmp, e.MarginBounds);
    e.Graphics.DrawImage(bmp, new Point(0, 0));
}

当这显示某些内容时,您必须调整缩放比例。可以很有趣(不),使用 PrintPreviewDialog 节省一些纸张。

于 2013-07-06T10:14:37.073 回答
1

这是代码。第一个函数被放置在 WPF 控件中。我必须建造一次。然后我在打印回调中获取了图像,用于设置图像。

public System.Drawing.Image GetMapImage()
{
    RenderTargetBitmap rtb = new RenderTargetBitmap((int)this.mapControl1.ActualWidth, (int)this.mapControl1.ActualHeight, 96, 96, PixelFormats.Pbgra32);
    rtb.Render(this.mapControl1);
    PngBitmapEncoder png = new PngBitmapEncoder();
    png.Frames.Add(BitmapFrame.Create(rtb));
    MemoryStream stream = new System.IO.MemoryStream();
    png.Save(stream);
    System.Drawing.Image image = System.Drawing.Image.FromStream(stream);

    return image;
}

void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    // Get the current map image. do not continue, if no image.
    Image oMapResized = ((bvMaps.MapDevex)this.mapMain.Child).GetMapImage();
    if (null == oMapResized)
        return;

    // Draw the image on the paper starting at the upper left corner.
    e.Graphics.DrawImage((Image)oMapResized, new Point(0, 0));
}

我在 StackOverflow 上找到了另一个帖子,这让我得到了答案。该代码适用于任何 WPF 控件。

从控制视图中获取位图图像

我确实必须在双方(Winforms 和 WPF)上添加一些参考,但归根结底,成功了!

于 2013-07-08T20:17:18.253 回答