¿Cómo puedo convertir un UserControl de WPF en un mapa de bits sin crear una ventana? Necesito renderizar un UserControl de WPF y subirlo a otro programa. 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?Cómo renderizar un UserControl de WPF en un mapa de bits sin crear una ventana
Respuesta
Terminó usando un 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;
}
Tuve que modificar tu solución un poco para que funcione para mí, pero usar una envoltura Win32 para forzar a WPF a cargar en una ventana oculta es una gran idea. – floele
@floele: tal vez para algunas soluciones, un contenedor 'Win32' es una gran idea. Pero en este caso, creo que @RQDQ tiene la solución adecuada. – IAbstract
Por favor dígame ¿Qué es WPFRenderer? (dónde está el archivo de ensamblaje y el espacio de nombres) –
Ha intentado 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 hay que medir, Organizar. Esto funcionó para mí.
basado en la solución de IDWMaster lo hice un poco diferente con el System.Windows.Forms.UserControl
. De lo contrario, los enlaces no estaban actualizados cuando se produjo la exportación al mapa de bits. Esto funciona para mí (this
es el control de WPF a render):
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;
Al parecer, si se llama a control.UpdateLayout()
después de la medición y la organización, el control de usuario no tiene por qué estar en cualquier ventana.
- 1. Crear elemento WPF fuera de pantalla y renderizar en mapa de bits
- 2. Renderizar un byte [] como mapa de bits en Android
- 3. Diferencia entre un mapa de bits y una imagen de mapa de bits en WPF
- 4. Obtener un mapa de bits desde una ventana de la aplicación WPF?
- 5. Renderice un control WPF "no visible" a una imagen de mapa de bits
- 6. ventana de WPF que aloja usercontrol
- 7. Cómo crear un WPF UserControl con contenido NOMBRADO
- 8. ¿Cómo puede un UserControl de WPF heredar un UserControl de WPF?
- 9. Escalando el contenido de WPF antes de renderizar en mapa de bits
- 10. ¿Cómo crear un borde blanco alrededor de mapa de bits?
- 11. Conversión de mapa de bits: crear un mapa de bits que excluya los lados transparentes del mapa de bits transparente
- 12. ¿Cómo limpiar un mapa de bits?
- 13. Preservar los valores de mapa de bits al crear un nuevo mapa de bits desde System.Drawing.Image
- 14. Cómo usar un ContextMenu UserControl en WPF?
- 15. Cómo agregar UserControl a un Panel en una Ventana de WPF
- 16. ¿Cómo evitar tener una ventana más pequeña que el tamaño mínimo de un UserControl en WPF?
- 17. WPF: ¿Cómo configuro la ventana de propietario de un cuadro de diálogo que muestra un UserControl?
- 18. ¿Cómo puedo obtener una imagen de mapa de bits de un recurso?
- 19. Heredar de un UserControl en WPF
- 20. Agregar WPF UserControl a la ventana WPF en el código
- 21. ¿Cómo renderizar bitmap en canvas en WPF?
- 22. Cuándo debe extraer un UserControl en WPF
- 23. Trabajar con mapa de bits en WPF
- 24. WPF Funcionamiento del mapa de bits
- 25. ¿Cómo creo un estilo dentro de un UserControl de WPF?
- 26. Mostrar un mapa de bits en una ventana de clase "BOTÓN" en WIN32
- 27. Cargando una ventana de WPF sin mostrarlo
- 28. wpf - Herencia de UserControl
- 29. Cómo desenfocar un mapa de bits (Android)?
- 30. Cómo renderizar un cursor transparente al mapa de bits preservando el canal alfa?
Quizás podría proporcionar un poco más de información. Si el Control de usuario no se puede representar, ¿por qué existe? Es un elemento visual. –
Tiene que representarse, pero no directamente en una pantalla (por lo que no puede haber ventana). Se está procesando en un cubo OpenGL. El renderizado de cubos funciona, pero actualmente tengo que crear una ventana separada para hacer el renderizado. Sería bueno si no necesitara una ventana separada para el renderizado de WPF. – IDWMaster