WPF WebBrowser(3.5 SP1)始终置顶 - 显示HTML在WPF中的其他建议

24

我一直在拼命地寻找一种在WPF应用程序中显示HTML的简单方法。

有几个选择:
1)使用WPF WebBrowser控件
2)使用Frame控件
3)使用第三方控件

但是,我遇到了以下问题: 1)WPF WebBrowser控件不是真正的WPF(它是包装在WPF中的Winforms控件)。我已经找到了一种方法来创建一个包装器,并使用DependencyProperties通过绑定和属性更改导航到HTML文本。但是,如果您将Winforms控件放入WPF滚动查看器中,则不会尊重z-index,这意味着winform始终位于其他WPF控件之上。这非常让人恼火,我试图通过创建WindowsFormsHost来解决它,该WindowsFormsHost托管一个ElemenHost等等,但这显然完全破坏了我的绑定。

2)Frame控件在显示HTML内容时存在相同的问题。不可选。

3)我没有找到原生的WPF HTML显示方式。所有选项都是Winforms,并具有上述问题。

目前我唯一的出路是使用Microsoft的有缺陷的HtmlToXamlConverter,有时会严重崩溃。(MSDN

有没有人有关于如何在WPF中显示HTLM而不出现这些问题的其他建议?

对于这个长问题,抱歉,希望有人知道我在说什么...


你能回顾一下你需要HTML显示什么吗?因为似乎将HTML塞进XAML中最多也很困难,所以可能有更简单或更本地的方法来实现你的目标。 - Rob Allen
好的,我只需要在WPF应用程序中显示HTML(主要是由Outlook生成的,但也来自Web应用程序中的HTML编辑器)。编辑HTML并不是必需的,因为这是在另一个组件中完成的。我已经尝试将此组件设置为只读,并从所有编辑功能中剥离它,但这与我的绑定不兼容(它也是一个Winform组件)。 通过显示HTML,我指的是显示格式、颜色、字体大小、链接... 图像也很好。 - RoelF
找到好的解决方法了吗?我也遇到了同样的问题。 - discorax
目前我正在使用答案评论中描述的技术:我使用了微软的html-to-xaml转换器代码,它似乎可以处理我投入其中75%的HTML。它需要在某些地方进行一些微调以支持我们的要求。对于另外的25%,我使用一个正则表达式/字符串替换函数来显示HTML的主体。我还在等待一种本地WPF方法来完成这个任务... - RoelF
3个回答


2

绕过z-index限制的另一种方法是使用弹出窗口将WPF组件覆盖在HTML上方。参见http://karlshifflett.wordpress.com/2009/06/13/wpf-float-buttons-over-web-browser-control/。注意下面的代码直接来自于该链接。

<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>

另外,还有一个第三方控件可以将Win32控件渲染成WPF位图(作为位图)http://www.codeplex.com/WPFWin32Renderer


谢谢提供信息,但对我来说这不是可行的解决方案...虽然很遗憾。 现在我会继续使用HTML到XAML和解析例程。 - RoelF

1

如果您不能使用WebBrowser,最好的选择可能是将HTML内容重写为FlowDocument(如果您正在使用静态HTML内容)。

否则,正如您所提到的那样,您必须特别处理WebBrowser,因为它不像一个“真正”的WPF控件。您应该创建一个ViewModel对象,可以将其绑定到表示WebBrowser控件的对象,在其中隐藏所有丑陋的非绑定代码,并且从未再次打开它 :)


现在,我正在使用Microsoft的HtmlToXamlConverter创建FlowDocument。但是,由于HTML并不总是有效的(请参见Exchange / Outlook生成的HTML),因此该函数有时会崩溃。因为绝对必须显示一些内容,所以我不得不预见备份方案,显示粗略的正文,剥离所有标记和一些标记替换(“<br/>”->“\n”等)。目前似乎这样做可以解决问题...感谢您的回复。 - RoelF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接