what netcore net gui dotnet avalonia asp wpf browser z-index

netcore - WPF 3.5 WebBrowser control y ZIndex



gui dotnet core (7)

Desafortunadamente, esto se debe a que el control WebBrowser es un envoltorio alrededor del control COM de Internet Explorer. Esto significa que obtiene su propio HWND y no permite que WPF dibuje nada sobre él. Tiene las mismas restricciones que el alojamiento de cualquier otro control Win32 o WinForms en WPF.

MSDN tiene más información sobre la interoperabilidad WPF / Win32.

Estoy intentando descubrir por qué el control no respeta a ZIndex.

Ejemplo 1 - que funciona bien

<Canvas> <Rectangle Canvas.ZIndex="1" Height="400" Width="600" Fill="Yellow"/> <Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/> </Canvas>

Ejemplo 2 - que no funciona

<Canvas> <WebBrowser Canvas.ZIndex="1" Height="400" Width="600" Source="http://www.stackoverflow.com"/> <Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/> </Canvas>

Gracias, - Ed


Logré resolver esto usando esta estructura, revise la configuración de propiedades en cada elemento:

<Canvas ClipToBounds="False"> <Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True"> <Expander> <Grid x:Name="YourContent"/> </Expander> <Popup> </Canvas>

Simplemente tiene que administrar el expansor para mostrar u ocultar su contenido, lo estoy usando para una barra de menú, creo que el expansor es opcional según el caso.

Vea esta imagen con el resultado, incluso puede mostrar sus controles en la parte superior del WebBrowser e incluso fuera de la ventana principal:


Podría SetWindowRgn para falsificar el área de superposición al ocultarlo como se muestra aquí:


Resolví un problema similar en el que alojaba un control WinForms de terceros en mi aplicación WPF. Creé un control WPF que procesa el control de WinForms en la memoria y luego lo pinta en un mapa de bits. Luego uso DrawImage en el método OnRender para dibujar el contenido renderizado. Finalmente enrute los eventos del mouse de mi control al control alojado. En el caso de un navegador web, también debería enrutar los eventos del teclado.

Mi caso fue bastante fácil: un gráfico con algunas interacciones simples con el mouse. Un control de navegador web puede tener otros problemas que no tomé en consideración. De todos modos, espero que eso ayude.


También puede usar un control emergente transparente para que algo flote sobre el control WebBrowser. Puede encontrar más información y un ejemplo de código aquí .


También toco este tema. En mi caso, estaba arrastrando imágenes de un panel al WebBrowser, pero por supuesto, tan pronto como mi imagen se movió al navegador, estaba oculta.

Actualmente trabajando en la siguiente solución:

  1. Cuando se inicie la Arrastre de imagen, cree un Mapa de bits del WebBrowser usando "RenderTargetBitmap"
  2. Agregue su mapa de bits al lienzo, usando el mismo ancho / ubicación que el navegador web
  3. webControl.Visibility = Visibility.Hidden.
  4. Cuando se libera el arrastre, elimine su mapa de bits y configure webControl.Visibility = Visible.

Esta solución es muy específica para mi situación, pero tal vez te dará algunas ideas.


Te encuentras con una trampa común de WPF, más comúnmente llamada "El problema del espacio aéreo". Una posible solución es NO usar el control WebBrowser, y en su lugar ir por algo un poco más loco, es decir, un navegador WebKit incorporado que rinde directamente a WPF. Hay dos paquetes que hacen esto; Awesomonium (comercial) y Berkelium (de código abierto). Hay un contenedor .NET para ambos.