将“不可见”WPF控件渲染为位图图像

时间:2011-05-03 11:16:12

标签: wpf bitmap render

将WPF控件渲染到位图图像并不像我今天发现的那样是一项简单的任务。正如我所知道的那样处理父控制边缘是一个问题,正如Rick Strahl在他的博客中所写的那样

http://www.west-wind.com/weblog/posts/2007/Sep/10/Rendering-a-WPF-Container-to-Bitmap

到目前为止,我能够创建窗口内可见的任何控件的位图,但我真正需要做的是创建不可见控件的位图。我只是在代码中创建它们 - 像矩形和椭圆这样的简单形状 - 并希望将它们保存为磁盘的位图。 对我来说,这是个人的噩梦。由于我的ActualHeight和ActualWidth始终为0,因此我使用高度和宽度。但我得到的只是一个空白的图像,大小与我无关。

如何在不将其添加到可见窗口的情况下创建任何控件的位图?

1 个答案:

答案 0 :(得分:22)

新元素尚未执行其布局。在渲染之前,您需要在控件上调用Measure and Arrange。

Canvas c = new Canvas();

Rectangle r = new Rectangle
{
    Fill = Brushes.Orange,
    Width = 200,
    Height = 100
};

Ellipse e = new Ellipse
{
    Fill = Brushes.DodgerBlue,
    Width = 100,
    Height = 100
};

Canvas.SetLeft(e, 150);

c.Children.Add(r);
c.Children.Add(e);

var size = new Size(250,100);
c.Measure(size);
c.Arrange(new Rect(size));

RenderTargetBitmap bmp = new RenderTargetBitmap(250, 100, 96, 96, PixelFormats.Pbgra32);

bmp.Render(c);

PngBitmapEncoder enc = new PngBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bmp));

using(var s = File.OpenWrite("image.png"))
    enc.Save(s);