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]()