Отобразить "невидимые" элементы управления WPF для растрового изображения
Отобразить элемент управления WPF для растрового изображения - это не тривиальная задача, как я узнал сегодня. Как я знаю, теперь проблема с родительским контролем - это проблема, как писал Рик Страл в своем блоге
http://www.west-wind.com/weblog/posts/2007/Sep/10/Rendering-a-WPF-Container-to-Bitmap
Пока я могу создавать растровые изображения любого элемента управления, который виден внутри окна, но мне действительно нужно сделать растровые изображения невидимых элементов управления. Я просто создаю их в коде - простые формы, такие как прямоугольник и эллипс, и хочу сохранить их как растровые изображения на диск.
Для меня это оказывается личным кошмаром. Поскольку мои ActualHeight и ActualWidth всегда равны 0, я вместо этого использую Height и Width. Но все, что я получаю, - это пустое изображение размера моего элемента управления.
Как создать растровое изображение любого элемента управления, не добавляя его в видимое окно?
Ответы
Ответ 1
Новые элементы не выполнили свой макет. Вы должны вызвать "Измерение" и "Упорядочить" на элементе управления перед его рендерингом.
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);