Отобразить «невидимые» элементы управления WPF в растровое изображение - PullRequest
11 голосов
/ 03 мая 2011

Отображение элемента управления WPF в растровом изображении не является тривиальной задачей, как я узнал сегодня. Как я теперь знаю, проблема с родительской контрольной границей является проблемой, как писал Рик Страл в своем блоге

http://www.west -wind.com / weblog / posts / 2007 / Sep / 10 / Рендеринг-WPF-контейнера в растровое изображение

Пока я могу создавать растровые изображения любого элемента управления, видимого внутри окна, но мне действительно нужно создавать растровые изображения невидимых элементов управления. Я просто создаю их в коде - простые формы, такие как прямоугольник и эллипс - и хочу сохранить их как растровые изображения на диск. Для меня это оказалось личным кошмаром. Так как мои ActualHeight и ActualWidth всегда равны 0, я вместо этого использую Высота и Ширина. Но все, что я получаю, это пустое изображение размером с мой элемент управления.

Как создать растровое изображение любого элемента управления, не добавляя его в видимое окно?

1 Ответ

22 голосов
/ 03 мая 2011

Для новых элементов их макет не выполнен.Вам необходимо вызвать 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);
...