c# - WPF WebBrowser(3.5 SP1) Siempre en la parte superior: otra sugerencia para mostrar HTML en WPF
.net-3.5 (3)
¿Has probado el Awesomium? Consulte: http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/
He estado buscando desesperadamente una manera fácil de mostrar HTML en una aplicación WPF. Hay algunas opciones:
1) usar el control de WPF WebBrowser
2) utilizar el control de marco
3) usar un control de terceros
pero, me he topado con los siguientes problemas: 1) El Control WebBrowser de WPF no es WPF real (es un control de Winforms envuelto en WPF). He encontrado una forma de crear un contenedor para esto y usar DependencyProperties para navegar a texto HTML con enlaces y propiedad cambiada. El problema con esto es que si coloca un control de Winforms en el scrollviewer de WPF, no respeta el índice z, lo que significa que la forma de win está siempre por encima de otro control de WPF. Esto es muy molesto, y he intentado solucionarlo creando un WindowsFormsHost que aloja un ElemenHost, etc., pero esto rompe completamente mi vinculación, obviamente.
2) Frame Control tiene los mismos problemas con la visualización si muestra contenido HTML. No es una opción.
3) No he encontrado una pantalla HTML nativa para WPF. Todas las opciones son winforms, y con los problemas mencionados anteriormente.
La única salida que tengo en este momento es usar el buggy HtmlToXamlConverter de Microsoft, que a veces falla. ( MSDN )
¿Alguien tiene alguna otra sugerencia sobre cómo mostrar HTLM en WPF, sin estos problemas?
Perdón por la larga pregunta, espero que alguien sepa de lo que estoy hablando ...
Otro enfoque para trabajar alrededor de la limitación del índice z es usar una ventana emergente para superponer los componentes de WPF sobre el HTML. Consulte http://karlshifflett.wordpress.com/2009/06/13/wpf-float-buttons-over-web-browser-control/ código de nota http://karlshifflett.wordpress.com/2009/06/13/wpf-float-buttons-over-web-browser-control/ continuación se toma directamente del enlace
<Grid>
<WebBrowser x:Name="wbBrowser" />
<Popup x:Name="puOverlay" AllowsTransparency="True" Placement="Bottom"
PlacementTarget="{Binding ElementName=wbBrowser}">
<Border x:Name="bdrOverLay" CornerRadius="30" BorderBrush="Blue"
Background="#1F000000" Padding="7" BorderThickness="2">
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Width" Value="75" />
<Setter Property="Margin" Value="3.5" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</StackPanel.Resources>
<Button Command="NavigationCommands.BrowseBack" Content="Back" />
<Button Command="NavigationCommands.BrowseForward" Content="Forward" />
<Button Command="NavigationCommands.BrowseHome" Content="Home" />
<Button Command="ApplicationCommands.Close" Content="Exit" />
</StackPanel>
</Border>
</Popup>
</Grid>
Como alternativa, hay un control de terceros que toma los controles de Win32 y los procesa (como mapas de bits) en WPF http://www.codeplex.com/WPFWin32Renderer
Si no puede usar WebBrowser, su mejor opción es probablemente volver a escribir su contenido HTML en un FlowDocument (si está usando contenido HTML estático).
De lo contrario, como mencionas, tienes que usar WebBrowser de casos especiales, tienes razón en que no actúa como un control "real" de WPF. Probablemente debería crear un objeto ViewModel al que pueda enlazar que represente el control WebBrowser donde puede ocultar todo el código feo no vinculante en un lugar, y luego nunca lo abra de nuevo :)