Как отобразить пользовательский элемент управления WPF в растровое изображение без создания окна - PullRequest
23 голосов
/ 04 марта 2011

Как я могу отобразить WPF UserControl в растровое изображение без создания окна? Мне нужно сделать WPF UserControl и загрузить его в другую программу. Растровые изображения будут отображаться с помощью службы Windows, поэтому создание окна не является вариантом (я знаю, что есть способы «виртуального» создания окон, но, к сожалению, все, что вызывает команду для создания окна, НЕ является вариантом в моем случае). Есть ли способ отрендерить UserControl без привязки его к окну?

Ответы [ 4 ]

57 голосов
/ 04 марта 2011

Вы пытались раскрутить экземпляр пользовательского элемента управления и делать что-то вроде этого:

UserControl control = new UserControl1();

control.Measure(new Size(300, 300));
control.Arrange(new Rect(new Size(300,300)));

RenderTargetBitmap bmp = new RenderTargetBitmap(300, 300, 96, 96, PixelFormats.Pbgra32);

bmp.Render(control);

var encoder = new PngBitmapEncoder();

encoder.Frames.Add(BitmapFrame.Create(bmp));

using (Stream stm = File.Create(@"c:\test.png"))
   encoder.Save(stm);

Похоже, вам нужно измерить, расположить.Это сработало для меня.

6 голосов
/ 05 марта 2011

Завершается использованием HwndHost без фактического окна.

void cwind()
    {
        Application myapp = new Application();
        mrenderer = new WPFRenderer();
        mrenderer.Width = 256;
        mrenderer.Height = 256;

        HwndSourceParameters myparms = new HwndSourceParameters();
        HwndSource msrc = new HwndSource(myparms);
        myparms.HwndSourceHook = new HwndSourceHook(ApplicationMessageFilter);

        msrc.RootVisual = mrenderer;
        myapp.Run();
    }
    static IntPtr ApplicationMessageFilter(
IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        return IntPtr.Zero;
    }
4 голосов
/ 05 марта 2015

По-видимому, если вы позвоните control.UpdateLayout() после измерения и упорядочения, пользовательский элемент управления не должен находиться ни в одном окне.

1 голос
/ 19 ноября 2012

Основываясь на решении IDWMaster, я сделал это немного по-другому, используя System.Windows.Forms.UserControl.В противном случае привязки не обновлялись, когда происходил экспорт в растровое изображение.Это работает для меня (this - это элемент управления WPF для рендеринга):

System.Windows.Forms.UserControl controlContainer = new System.Windows.Forms.UserControl();
controlContainer.Width = width;
controlContainer.Height = height;
controlContainer.Load += delegate(object sender, EventArgs e)
{
    this.Dispatcher.BeginInvoke((Action)delegate
    {
        using (FileStream fs = new FileStream(path, FileMode.Create))
        {
            RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
            bmp.Render(this);
            BitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            encoder.Save(fs);
            controlContainer.Dispose();
        }
    }, DispatcherPriority.Background);
};

controlContainer.Controls.Add(new ElementHost() { Child = this, Dock = System.Windows.Forms.DockStyle.Fill });
IntPtr handle = controlContainer.Handle;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...