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>

Спасибо, - Ed

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

  • Когда начинается перетаскивание изображения, создайте растровое изображение веб-браузера с помощью "RenderTargetBitmap"
  • Добавьте растровое изображение в холст, используя ту же ширину/местоположение, что и веб-браузер
  • webControl.Visibility = Visibility.Hidden.
  • Когда перетащите выделение, удалите растровое изображение и установите webControl.Visibility = Visible.

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

Ответ 7

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

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

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

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

enter image description here