WPF 3.5 Веб-браузер управления и ZIndex - PullRequest
10 голосов
/ 17 сентября 2008

Я пытаюсь выяснить, почему элемент управления не поддерживает ZIndex.

Пример 1 - который отлично работает

   <Canvas>
       <Rectangle Canvas.ZIndex="1" Height="400" Width="600" Fill="Yellow"/>
       <Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/>
   </Canvas>

Пример 2 - который не работает

   <Canvas>
       <WebBrowser Canvas.ZIndex="1" Height="400" Width="600" Source="http://www.stackoverflow.com"/>
       <Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/>
  </Canvas>

Спасибо, - Ed

Ответы [ 6 ]

22 голосов
/ 17 сентября 2008

К сожалению, это связано с тем, что элемент управления WebBrowser является оболочкой для элемента управления COM в Internet Explorer. Это означает, что он получает свой собственный HWND и не позволяет WPF рисовать что-либо поверх него. Он имеет те же ограничения, что и любой другой элемент управления Win32 или WinForms в WPF.

MSDN содержит дополнительную информацию о взаимодействии WPF / Win32.

4 голосов
/ 17 ноября 2010

Вы столкнулись с распространенной ошибкой WPF, обычно называемой «проблемой воздушного пространства». Возможное решение - НЕ использовать элемент управления WebBrowser, а вместо этого пойти на что-то более безумное, а именно встроенный браузер WebKit, отображающий непосредственно в WPF. Есть два пакета, которые делают это; Awesomonium (коммерческий) и Berkelium (с открытым исходным кодом). Для них есть .NET-оболочка.

3 голосов
/ 07 мая 2009

Вы можете SetWindowRgn подделать перекрывающуюся область, скрыв ее, как показано здесь:

1 голос
/ 12 ноября 2013

Мне удалось решить эту проблему с помощью этой структуры, проверьте конфигурацию свойств в каждом элементе:

<Canvas ClipToBounds="False">
     <Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
         <Expander>
            <Grid x:Name="YourContent"/>
         </Expander>
     <Popup>
</Canvas>

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

Посмотрите на эту картинку с результатом, вы даже можете показать свои элементы управления поверх веб-браузера и даже за пределами главного окна:

enter image description here

1 голос
/ 03 апреля 2010

Я тоже затронул эту проблему. В моем случае я перетаскивал изображения с одной панели в WebBrowser, но, разумеется, как только мое изображение перемещалось в браузер, оно скрывалось.

В настоящее время работает над следующим решением:

  1. Когда начинается перетаскивание изображения, создайте растровое изображение веб-браузера, используя «RenderTargetBitmap»
  2. Добавьте ваше растровое изображение на холст, используя ту же ширину / местоположение, что и веб-браузер
  3. webControl.Visibility = Visibility.Hidden.
  4. Когда перетаскивание отпущено, удалите ваше растровое изображение и установите webControl.Visibility = Visible.

Это решение очень специфично для моей ситуации, но, возможно, оно даст вам некоторые идеи.

1 голос
/ 18 сентября 2008

Я решил аналогичную проблему, когда размещал сторонний элемент управления WinForms в своем приложении WPF. Я создал элемент управления WPF, который отображает элемент управления WinForms в памяти, а затем рисует его в растровое изображение. Затем я использую DrawImage в методе OnRender для рисования визуализированного содержимого. Наконец, я перенаправил события мыши из моего элемента управления в размещенный элемент управления. В случае веб-браузера вам также придется маршрутизировать события клавиатуры.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...