wpf - 将 "not visible"WPF 控件渲染为位图图像

标签 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,因此我改用高度和宽度。但我得到的只是我的控件大小的空图像。

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

最佳答案

新元素尚未执行布局。在渲染之前,您需要在控件上调用 Measure 和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);

关于wpf - 将 "not visible"WPF 控件渲染为位图图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5868631/

相关文章:

C# + XAML - UI 在更改后没有得到更新

android - 将位图保存到应用程序文件夹

javascript - AngularJS - 在指令内的 $render 上动态应用类

backbone.js - 在 Backbone View 渲染上动态设置 className

c# - 延迟取消选择 ListBoxItem

c# - 使用鼠标滚动放大和缩小 ViewBox,并使用鼠标指针位置作为缩放原点

java - C#/Java 压缩 JPG 图像

c++ - 将位图转换为垫子

ruby-on-rails - Hartle 第 11 章缺少部分微博/_micropost

wpf - 如何在 WPF 中将组合框与数据集绑定(bind)