Управление WPF 3.5 WebBrowser и ZIndex

Я пытаюсь понять, почему контроль не чтит 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>

спасибо, -- Эд!--3-->

7 ответов


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

MSDN имеет больше информации о взаимодействии WPF / Win32.


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


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


вы также можете использовать прозрачный всплывающий элемент управления, чтобы что-то плавать поверх элемента управления WebBrowser. Более подробную информацию и образец кода можно найти здесь.


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

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


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

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

  1. когда начнется перетаскивание изображения, создайте растровое изображение веб-браузера с помощью "RenderTargetBitmap"
  2. добавьте растровое изображение на холст, используя ту же ширину / местоположение, что и webbrowser
  3. сторон компании webcontrol.Видимость= Видимость.Скрытый.
  4. когда перетаскивание будет выпущено, удалите растровое изображение и установите webControl.Видимость = Видимость.

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


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

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

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

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

enter image description here