Как отрендерить WPF UserControl в растровое изображение без создания окна

Я как раз собираюсь начать делать TDD JavaScript на новом проекте, я продолжаю работать. Мой текущий план состоит в том, чтобы использовать qunit, чтобы сделать поблочное тестирование. В то время как разработка тестов может быть выполнена путем простого обновления тестовой страницы в браузере.

Для непрерывной интеграции (и обеспечение тестового прогона во всех браузерах), я буду использовать Селен , чтобы автоматически загрузить тестовую обвязку в каждом браузере и считать результат. Эти тесты будут запущены на каждой регистрации к управлению исходным кодом.

я также собираюсь использовать JSCoverage для получения анализа покрытия кода тестов. Это будет также автоматизировано с Селеном.

я в настоящее время посреди установки этого. Я обновлю этот ответ с более точными деталями, как только мне выработали установку.

Инструменты тестирования:

24
задан bbosak 4 March 2011 в 02:52
поделиться

2 ответа

Заканчивается использованием 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;
    }
7
ответ дан 28 November 2019 в 22:29
поделиться

Основываясь на решении 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;
1
ответ дан 28 November 2019 в 22:29
поделиться