Cómo renderizar un UserControl de WPF en un bitmap sin crear una ventana

¿Cómo puedo renderizar un UserControl de WPF en un bitmap sin crear una ventana? Necesito renderizar un UserControl de WPF y subirlo a otro progtwig. Los mapas de bits se procesarán a través de un servicio de Windows, por lo que crear una ventana no es una opción (sé que hay formas de crear ventanas ‘prácticamente’, pero desafortunadamente todo lo que llama un comando para crear una ventana NO es una opción en mi caso). ¿Hay alguna manera de RENDER el UserControl sin vincularlo a una ventana?

¿Has intentado hacer girar una instancia del control de usuario y hacer algo como esto?

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); 

Parece que necesita Medir, Organizar. Esto funcionó para mí.

Terminó usando HwndHost sin ventana real.

 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; } 

Aparentemente, si llama a control.UpdateLayout() después de medir y organizar, el control de usuario no necesita estar en ninguna ventana.

Basado en la solución de IDWMaster lo hice de una manera un poco diferente usando System.Windows.Forms.UserControl . De lo contrario, los enlaces no estaban actualizados cuando se produjo la exportación al bitmap. Esto funciona para mí ( this es el control de WPF para representar):

 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;