2008-09-17 24 views
10

Estoy tratando de averiguar por qué el control no respeta ZIndex.WPF 3.5 WebBrowser control y ZIndex

Ejemplo 1 - que funciona muy 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

Respuesta

21

Desafortunadamente esto es debido a que el control WebBrowser es una envoltura 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 WPF/Win32 interoperabilidad.

1

Resolví un problema similar en el que estaba alojando 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.

3

Se podría SetWindowRgn de falsificar el área de superposición escondiéndolo como se muestra aquí:

+1

@Ricky - Gracias por la crítica. Trataré de no abusar de esta palabra en el futuro. Intento evitar usar el método de palabra cuando hablo de programación debido a la ambigüedad con el método de palabra cuando se usa en el contexto de Programación Orientada a Objetos. Me pregunto si hay una palabra mejor. – jpierson

3

También puede utilizar un control emergente transparente para tener algo flotante en la parte superior del control WebBrowser. Se puede encontrar más información y un ejemplo de código here.

+4

No me gustan las ventanas emergentes, ya que tienden a permanecer en su pantalla incluso si cambia a otra aplicación, y no parecen estar adjuntas a su aplicación, por lo que cuando cambia de tamaño/mueve su aplicación, la ventana emergente no se mueve con eso. – Rachel

1

También he solucionado este problema. 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 trabaja en la siguiente solución:

  1. Cuando se inicia el arrastre de imágenes, crear un mapa de bits de la WebBrowser utilizando "RenderTargetBitmap"
  2. Añadir su mapa de bits a la lona, ​​usando el mismo ancho/localizació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 le dará algunas ideas.

4

Te encuentras con una falla 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, a saber, 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.

1

que logró resolver esto mediante el uso de esta estructura, echa un vistazo a la configuración de las propiedades de cada elemento:

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

Sólo hay que gestionar 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.

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

enter image description here

Cuestiones relacionadas