2009-06-11 15 views
23

He estado buscando desesperadamente una manera fácil de mostrar HTML en una aplicación WPF. hay algunas opciones:
1) utilizar el control WebBrowser WPF
2) utilizar el Control de Trama
3) utilizar un control de terceros
WPF WebBrowser (3.5 SP1) Siempre en la parte superior: otra sugerencia para mostrar HTML en WPF

pero, he topó con los siguientes problemas: 1) WPF WebBrowser Control no es WPF real (es un control de Winforms envuelto en WPF). He encontrado una manera de crear un contenedor para esto y usar DependencyProperties para navegar al texto HTML con enlaces y cambios de propiedad. El problema con esto es que si coloca un control Winforms en WPF scrollviewer, no respeta z-index, lo que significa que el winform siempre está encima del otro control WPF. Esto es muy molesto, y he tratado de solucionarlo creando un WindowsFormsHost que aloja un ElemenHost, etc. pero esto rompe completamente mi enlace, obviamente.

2) Frame Control tiene los mismos problemas para mostrar 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 se cuelga. (MSDN)

¿Alguien tiene alguna otra sugerencia sobre cómo mostrar HTLM en WPF, sin estos problemas?

lo siento por la pregunta larga, espero que nadie sabe lo que estoy hablando ...

+0

¿Puede hacer una copia de seguridad y describir qué necesita HTML para mostrar? Puede haber una manera más fácil o más nativa de lograr su objetivo, ya que parece que meter HTML en XAML es difícil en el mejor de los casos. –

+0

bueno, solo necesito mostrar HTML (principalmente generado por outlook, pero también de editores de HTML en aplicaciones web) en una aplicación WPF. No es necesario editar el HTML porque eso ocurre en un componente diferente. Ya intenté hacer este componente de solo lectura y quitarlo de todas las funciones de edición, pero eso no funciona bien con mi encuadernación (también es un componente de winform). Con HTML de pantalla me refiero a mostrar el formato, los colores, las fuentes, los enlaces ... las imágenes también serían agradables. – RoelF

+0

encontró una buena manera todavía? me he encontrado con el mismo problema. – discorax

Respuesta

1

Si no puede usar WebBrowser, lo mejor es volver a escribir probablemente su contenido HTML en un FlowDocument (si está usando contenido HTML estático).

De lo contrario, como usted menciona, tiene que tener un caso especial WebBrowser, tiene razón en que no actúa como un control "real" de WPF. Probablemente deberías crear un objeto ViewModel al que puedas vincular para que represente el control WebBrowser donde puedes ocultar todo el código feo no vinculante en un lugar, y luego nunca lo abras de nuevo :)

+0

Bueno, ahora estoy creando un FlowDocument usando el HtmlToXamlConverter de Microsoft. Pero, dado que HTML no siempre es válido (ver HTML generado por Exchange/Outlook), esta función falla a veces. Debido a que es absolutamente necesario mostrar algo, tuve que prever un escenario de respaldo que muestra el cuerpo áspero, despojado de todas las etiquetas y algunos reemplazos de etiquetas ("
" -> "\ n" etc ...). Esto parece funcionar por ahora ... gracias por su respuesta. – RoelF

1

Otro enfoque para trabajar en torno al limitación índice z es utilizar una ventana emergente para superponer sus componentes WPF sobre el HTML Ver http://karlshifflett.wordpress.com/2009/06/13/wpf-float-buttons-over-web-browser-control/ código Nota a continuación se toma directamente desde el 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> 

Alternativly hay una tercera control de los partidos que lleva controles de Win32 y los hace (como mapas de bits) en WPF http://www.codeplex.com/WPFWin32Renderer

+0

gracias por la información, pero esta no es una solución viable para mí ... aunque es una lástima. Por ahora me quedaré con las rutinas html-to-xaml y parse. – RoelF

Cuestiones relacionadas