WPF WebBrowser (3.5 SP1) Всегда сверху - другое предложение для отображения HTML в WPF - PullRequest
23 голосов
/ 11 июня 2009

Я отчаянно искал простой способ отображения HTML в WPF-приложении. Есть несколько вариантов:
1) использовать WPF WebBrowser Control
2) использовать Frame Control
3) использовать сторонний контроль

но я столкнулся со следующими проблемами: 1) Элемент управления WPF WebBrowser не является реальным WPF (это элемент управления Winforms, заключенный в WPF). Я нашел способ создать обертку для этого и использовать DependencyProperties для перехода к тексту HTML с привязками и измененными свойствами. Проблема в том, что если вы помещаете элемент управления Winforms в WPF scrollviewer, он не учитывает z-index, что означает, что winform всегда находится поверх другого элемента управления WPF. Это очень раздражает, и я попытался обойти это, создав WindowsFormsHost, который содержит ElemenHost и т. Д., Но это явно нарушает мою привязку.

2) Frame Control имеет те же проблемы с отображением, если он показывает содержимое HTML. Не вариант.

3) Я не нашел собственный HTML-дисплей для WPF. Все опции являются winforms, и с вышеупомянутыми проблемами.

единственный выход, который у меня есть на данный момент, это использование глючного Microsoft HtmlToXamlConverter, который иногда дает сбой. ( 1010 * MSDN *)

Есть ли у кого-нибудь еще предложения по отображению HTLM в WPF без этих проблем?

извините за длинный вопрос, надеюсь, кто-нибудь знает, о чем я говорю ...

Ответы [ 3 ]

3 голосов
/ 30 апреля 2010

вы пробовали Awesomium? пожалуйста, обратитесь к: http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/

1 голос
/ 02 июля 2009

Другой подход к обходу ограничения 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

1 голос
/ 11 июня 2009

Если вы не можете использовать WebBrowser, лучше всего переписать ваш HTML-контент в FlowDocument (если вы используете статический HTML-контент).

В противном случае, как вы упоминаете, вам в некотором роде необходим специальный браузер WebBrowser, вы правы в том, что он не действует как "настоящий" элемент управления WPF. Вероятно, вам следует создать объект ViewModel, который вы можете привязать к нему, который представляет элемент управления WebBrowser, где вы можете спрятать весь некрасивый необязательный код в одном месте и никогда больше не открывать его:)

...