c# - 绘制控件到内存(位图)

标签 c# wpf bitmap controls render

是否可以在不在屏幕上绘制的情况下将 wpf 控件绘制到内存(位图)?
我找到了一个如何保存到位图的示例,但它仅在窗口已在屏幕上绘制时才有效。

BitmapImage bitmap = new BitmapImage();
    RenderTargetBitmap renderTarget =
    new RenderTargetBitmap((int)canvaspad.Width,
    (int)canvaspad.Height,
    96,
    96,
    System.Windows.Media.PixelFormats.Default);
renderTarget.Render(canvaspad);

最佳答案

由于控件没有父容器,需要调用MeasureArrange为了做一个适当的布局。由于布局是异步完成的(请参阅 MeasureArrange 中的备注),您可能还需要调用 UpdateLayout强制立即更新布局。

public BitmapSource RenderToBitmap(UIElement element, Size size)
{
    element.Measure(size);
    element.Arrange(new Rect(size));
    element.UpdateLayout();

    var bitmap = new RenderTargetBitmap(
        (int)size.Width, (int)size.Height, 96, 96, PixelFormats.Default);

    bitmap.Render(element);
    return bitmap;
}

如果您已经设置了元素的 WidthHeight,您可以将其用于尺寸参数:

var grid = new Grid
{
    Width = 200,
    Height = 200,
    Background = Brushes.Yellow
};

grid.Children.Add(
    new Ellipse
    {
        Width = 100,
        Height = 100,
        Fill = Brushes.Blue
    });

var bitmap = RenderElement(grid, new Size(grid.Width, grid.Height));

关于c# - 绘制控件到内存(位图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14952617/

相关文章:

c# - 将合约添加到接口(interface)实现

c# - C#监听键盘事件

c# - MVVM 按钮可见性

c# - 窗口调整大小处理事件

android - bitmap.createscaledbitmap 在棉花糖中不起作用

c# - 如何检查两个图像是否相同

c# 如何将 Console.WriteLine 分配给变量

c# - WPF 绑定(bind)到带有类的字典

vb.net - 禁用图片框上的图像混合

c# - 有人可以提供 ImageCompare 方法的示例吗?