Элемент управления WebBrowser WPF 3.5 и 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>
Спасибо, - Эд
Решение
К сожалению, это связано с тем, что элемент управления 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 для рисования визуализированного содержимого.Наконец, я перенаправил события мыши из моего элемента управления в размещенный элемент управления.В случае веб-браузера вам также придется маршрутизировать события клавиатуры.
Мой случай был довольно простым — диаграмма с простым взаимодействием с мышью.Элемент управления веб-браузером может иметь и другие проблемы, которые я не учел.В любом случае, я надеюсь, что это поможет.
Я тоже затронул эту проблему.В моем случае я перетаскивал изображения из одной панели в веб-браузер, но, конечно, как только мое изображение перемещалось в браузер, оно скрывалось.
Сейчас работаю над следующим решением:
- Когда начнется перетаскивание изображения, создайте растровое изображение веб-браузера, используя «RenderTargetBitmap».
- Добавьте растровое изображение на холст, используя ту же ширину/расположение, что и веб-браузер.
- webControl.Visibility = Видимость.Скрытый.
- Когда перетаскивание будет отпущено, удалите растровое изображение и установите webControl.Visibility = Visible.
Это решение очень специфично для моей ситуации, но, возможно, оно даст вам некоторые идеи.
Мне удалось решить эту проблему, используя эту структуру, проверьте конфигурацию свойств каждого элемента:
<Canvas ClipToBounds="False">
<Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
<Expander>
<Grid x:Name="YourContent"/>
</Expander>
<Popup>
</Canvas>
Вам просто нужно управлять расширителем, чтобы показывать или скрывать ваш контент, я использую его для строки меню, я думаю, что расширитель не является обязательным в зависимости от случая.
Посмотрите на эту картинку с результатом: вы даже можете отображать свои элементы управления поверх веб-браузера и даже за пределами главного окна: