Вопрос

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

Спасибо, - Эд

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

Сейчас работаю над следующим решением:

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

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

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

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

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

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

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top