【问题标题】:WPF WebBrowser (3.5 SP1) Always on top - other suggestion to display HTML in WPFWPF WebBrowser (3.5 SP1) 始终在最前面 - 在 WPF 中显示 HTML 的其他建议
【发布时间】:2010-11-02 02:15:11
【问题描述】:

我一直在拼命寻找一种在 WPF 应用程序中显示 HTML 的简单方法。 有一些选择:
1) 使用 WPF WebBrowser 控件
2) 使用框架控件
3) 使用第三方控件

但是,我遇到了以下问题: 1) WPF WebBrowser 控件不是真正的 WPF(它是一个包装在 WPF 中的 Winforms 控件)。我找到了一种为此创建包装器并使用 DependencyProperties 导航到具有绑定和属性更改的 HTML 文本的方法。 这样做的问题是,如果你在 WPF 滚动查看器中放置一个 Winforms 控件,它不尊重 z-index,这意味着 Winform 始终位于其他 WPF 控件之上。这很烦人,我试图通过创建一个承载 ElemenHost 等的 WindowsFormsHost 来解决它。但这显然完全破坏了我的绑定。

2) 如果 Frame Control 显示 HTML 内容,则会出现同样的显示问题。不是一个选项。

3) 我还没有找到 WPF 的原生 HTML 显示。所有选项都是winforms,并且存在上述问题。

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

在没有这些问题的情况下,是否有人对如何在 WPF 中显示 HTLM 有任何其他建议?

抱歉问了这么长的问题,希望有人知道我在说什么......

【问题讨论】:

  • 您能否备份并描述您需要 HTML 显示的内容?可能有一种更简单或更本机的方式来实现您的目标,因为将 HTML 塞进 XAML 似乎是最困难的。
  • 好吧,我只需要在 WPF 应用程序中显示 HTML(主要由 Outlook 生成,但也来自 webapps 中的 HTML 编辑器)。不需要编辑 HTML,因为这发生在不同的组件中。我已经尝试将此组件设为只读并将其从所有编辑功能中剥离,但这不适用于我的绑定(它也是一个 winform 组件)。对于显示 HTML,我的意思是显示格式、颜色、字体大小、链接......图像也会很好。
  • 找到好方法了吗?我遇到了同样的问题。
  • discorax > 现在我正在使用 cmets 中描述的技术来回答:我使用了微软的 html-to-xaml 转换器代码,这似乎适用于我抛出的 75% 的 html在它。它需要在这里和那里进行一些调整来支持我们的要求。对于另外 25%,我使用显示 html 正文的正则表达式/字符串替换函数。我还在等待原生 WPF 方式来做到这一点......

标签: c# html wpf .net-3.5


【解决方案1】:

【讨论】:

    【解决方案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-to-xaml 和解析例程。
    【解决方案3】:

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

    否则,正如您所提到的,您必须使用特殊情况的 WebBrowser,您是对的,它不像“真正的”WPF 控件。您可能应该创建一个可以绑定到的 ViewModel 对象,该对象代表 WebBrowser 控件,您可以在其中将所有丑陋的非绑定代码隐藏在一个地方,然后永远不要再次打开它:)

    【讨论】:

    • 好吧,现在我确实使用 Microsoft 的 HtmlToXamlConverter 创建了一个 FlowDocument。但是,由于 HTML 并不总是有效的(参见 Exchange/Outlook 生成的 HTML),因此该函数有时会崩溃。因为显示某些东西是绝对必要的,所以我不得不预见一个备份场景,它显示粗略的主体,剥离所有标签和一些标签替换(“
      ”->“\n”等...)。这似乎暂时有效...感谢您的回复。
    猜你喜欢
    • 2011-10-30
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多