El extraño caso del WebView que siempre mantiene visible sobre los demás controles – WinRT – C#

Cuando usamos el control WebView y por azares del destino necesitamos dibujar un control encima de el nos encontramos con la desagradable noticia de que este control siempre se muestra encima de los demás.

Horrible resultado...

Porqué pasa?

En WinRT un WebView es un control que utiliza una ventana que hace aparte de Internet Explorer, por ende para accederla WinRT hace uso de COM para así invocar esta funcionalidad, pero para el sistema de ventanas esta ventana del WebView hace parte de otra aplicación no de la tuya, por ende a la final es una ventana a la cual las controles hijos de nuestra ventana principal no se pueden superponer, así que siempre aparece encima, salvo que TODA nuestra aplicación este encima de ella.

Se puede solucionar?

La mala noticia es que ese comportamiento no se puede evitar salvo que cambien la manera en como funciona el WebView en WinRT.

La buena noticia es que podemos ser creativos, en WinRT existe la forma de tomar un "screenshot" al WebView , la idea es tomar el screenshot y justo al mostrar el UserControl ocultar el WebView y dejar en su lugar el screenshot.

La clase WebViewBrush permite renderizar el contenido de un WebView en un objeto, así que usaremos este control para lograr nuestro propósito.

 var brush = new WebViewBrush();
brush.SetSource(WebViewControl);
brush.Redraw();
Rectangulo.Fill = brush;

Hemos creado un nuevo WebViewBrush al cual le establecimos como fuente de datos el WebView, luego llamamos el método Redraw, en ese instante el contenido del WebView se renderiza en la brocha.

A partir de este momento el WebViewBrush se comporta como un ImageBrush por lo cual cualquier cosa que pintemos con la brocha usará la imagen renderizada previamente del WebView.

Teniendo ya el Rectangle con el contenido del WebView el resto es solo decidir en que momento muestras el WebView o lo cambias por el Rectangle.

Acá un ejemplo de como utilizar esa solución en un proyecto real:

Hacer que el webview no aparezca sobre los demas controles

Saludos!