5

画面にまったく描画せずにwpfコントロールをメモリ(ビットマップ)に描画することは可能ですか?
Bitmap に保存する方法の例を見つけましたが、ウィンドウが画面に描画されている場合にのみ機能します。

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

1 に答える 1

9

コントロールには親コンテナーがないため、適切なレイアウトを行うには、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;
}

Width要素のandをすでに設定している場合はHeight、それを size パラメータに使用できます。

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));
于 2013-02-19T08:49:31.183 に答える