Создать изображение контрола

303
13 января 2017, 07:06

Мне нужно создать изображение контрола. Делаю таким образом

public static BitmapFrame CreateControlFrame(FrameworkElement control)
{
    var width = control.ActualWidth == 0 ? control.Width : control.ActualWidth;
    var height = control.ActualHeight == 0 ? control.Height : control.ActualHeight;
    var bmp = new RenderTargetBitmap((int)Math.Ceiling(width), (int)Math.Ceiling(height), 96, 96, PixelFormats.Pbgra32);
    bmp.Render(control);
    return BitmapFrame.Create(bmp);
}

но это работает только если у меня контрол находится на форме и он видимый. А мне надо создать изображение контрола, которого нет на форме или он скрыт (Visibility = Hidden/Collapsed)

В идеале вот так

var btn = new Button();
btn.Content = "qwe";
btn.Width = 100;
btn.Height = 30;
WpfControlRenderer.CreateControlScreenshot(btn, "ss.png");

Может кто знает как?

Answer 1

На этот вопрос уже был дан ответ на англоязычном stackoverflow: Render a “not visible” WPF controls to an bitmap image

Для контрола необходимо вызывать методы Measure и Arrange, для их лайоутинга, и только потом - рендерить:

var btn = new Button();
btn.Content = "qwe";
btn.Width = 100;
btn.Height = 30;
var size = new Size(250,250);
btn.Measure(size);
btn.Arrange(new Rect(size));
RenderTargetBitmap bmp = new RenderTargetBitmap(250, 100, 96, 96, PixelFormats.Pbgra32);
bmp.Render(btn);
PngBitmapEncoder enc = new PngBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bmp));
using(var s = File.OpenWrite("image.png"))
    enc.Save(s);
READ ALSO
С# таймер в отдельном потоке

С# таймер в отдельном потоке

При обновлении данных хотелось бы видеть сколько времени прошло от старта до завершенияИ видеть в онлайн времени

363
ListBox цвет фокуса

ListBox цвет фокуса

Как изменить цвет фона выделения и цвет текста в ListBox'e?

398
Как читать XML из строки?

Как читать XML из строки?

XML опытный образец:

341