WPF WebBrowser (3.5 SP1) Всегда сверху - другое предложение отображать HTML в WPF
Я отчаянно искал простой способ отображения HTML в WPF-приложении.
Есть несколько вариантов:
1) использовать WPF WebBrowser Control
2) используйте Frame Control
3) использовать сторонний элемент управления
но я столкнулся с следующими проблемами:
1) WPF WebBrowser Control не является реальным WPF (это элемент управления Winforms, завернутый в WPF). Я нашел способ создать обертку для этого и использовать DependencyProperties, чтобы перейти к тексту HTML с привязками и propertychanged.
Проблема с этим заключается в том, что если вы поместите элемент управления Winforms в scrollviewer WPF, он не будет уважать z-index, то есть winform всегда находится поверх другого элемента управления WPF. Это очень раздражает, и я попытался обойти это, создав WindowsFormsHost, в котором размещается ElemenHost и т.д., Но это полностью нарушает мою привязку.
2) Frame Control имеет те же проблемы с отображением, если он показывает содержимое HTML. Не вариант.
3) Я не нашел собственный HTML-дисплей для WPF. Все варианты - winforms, и с вышеупомянутыми проблемами.
Единственный выход, который у меня есть на данный момент, - это использовать Microsoft buggy HtmlToXamlConverter, который иногда может быть поврежден. (MSDN)
Есть ли у кого-нибудь другие предложения о том, как отображать HTLM в WPF, без этих проблем?
Извините за длинный вопрос, надеюсь, что кто-то знает, о чем я говорю...
Ответы
Ответ 1
Если вы не можете использовать WebBrowser, лучше всего переписать HTML-контент в FlowDocument (если вы используете статический HTML-контент).
В противном случае, как вы уже упоминаете, у вас есть специальный веб-браузер WebBrowser, вы правы, что он не действует как "реальный" элемент управления WPF. Вероятно, вы должны создать объект ViewModel, с которым вы можете привязать объект, который представляет элемент управления WebBrowser, где вы можете скрыть весь уродливый несвязывающий код в одном месте, а затем никогда не открывать его снова:)
Ответ 2
Вы пробовали Awesomium?
обратитесь к: http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/
Ответ 3
Другим подходом к ограничению z-индекса является использование всплывающего окна для наложения ваших компонентов 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>
Alternativly есть сторонний элемент управления, который берет элементы управления Win32 и отображает их (как битовые карты) в WPF http://www.codeplex.com/WPFWin32Renderer