我一直在拼命寻找在WPF应用程序中显示HTML的简单方法。
有一些选择:
1)使用WPF WebBrowser控件
2)使用框架控制
3)使用第三方控制
但是,我遇到了以下问题: 1)WPF WebBrowser控件不是真正的WPF(它是一个包装在WPF中的Winforms控件)。我找到了一种为此创建包装器的方法,并使用DependencyProperties导航到带有绑定和propertychanged的HTML文本。 这个问题是,如果你在WPF scrollviewer中放置Winforms控件,它不会尊重z-index,这意味着winform始终位于其他WPF控件之上。这非常烦人,我试图通过创建一个承载ElemenHost等的WindowsFormsHost来解决它。但这显然完全破坏了我的绑定。
2)如果显示HTML内容,则帧控制具有相同的显示问题。不是一种选择。
3)我还没有找到WPF的原生HTML显示。所有选项都是winforms,并且存在上述问题。
目前我唯一的出路就是使用微软的HtmlToXamlConverter,它有时会很难崩溃。 (MSDN)
有没有人对如何在WPF中显示HTLM有任何其他建议,没有这些问题?
抱歉这个长期的问题,希望有人知道我在说什么......答案 0 :(得分:3)
答案 1 :(得分:1)
如果您不能使用WebBrowser,最好的办法是将HTML内容重写为FlowDocument(如果您使用的是静态HTML内容)。
否则,正如你所提到的,你需要特殊情况下的WebBrowser,你是对的,它不像“真正的”WPF控件。您应该创建一个可以绑定到的ViewModel对象,它表示WebBrowser控件,您可以在一个位置隐藏所有丑陋的非绑定代码,然后再也不会打开它:)
答案 2 :(得分:1)
解决z-index限制的另一种方法是使用弹出窗口在HTML上覆盖WPF组件 请参阅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