Я пытаюсь понять, почему элемент управления не соблюдает 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.
Действует ли он по-прежнему или есть возможность его достичь?
Я решил аналогичную проблему, когда я размещал сторонний элемент управления WinForms в своем приложении WPF. Я создал элемент управления WPF, который отображает элемент управления WinForms в памяти, а затем раскрашивает его в растровое изображение. Затем я использую DrawImage в методе OnRender для рисования визуализированного содержимого. Наконец, я перенаправил события мыши из своего элемента управления в размещенный элемент управления. В случае веб-браузера вам также придется маршрутизировать события клавиатуры.
Мой случай был довольно простым - диаграмма с простым взаимодействием с мышью. У элемента управления веб-браузера могут быть другие проблемы, которые я не учел. В любом случае я надеюсь, что это поможет.
Вы можете SetWindowRgn имитировать перекрывающуюся область, скрывая ее, как показано здесь:
@Ricky - Спасибо за критику. Я постараюсь не злоупотреблять этим словом в будущем. Я стараюсь избегать использования слова «метод» при обсуждении программирования из-за двусмысленности слова «метод» в контексте объектно-ориентированного программирования. Интересно, есть ли лучшее слово.
Я тоже затронул эту проблему. В моем случае я перетаскивал изображения с одной панели в WebBrowser, но, конечно, как только мое изображение перемещалось в браузер, оно было скрыто.
В настоящее время работаю над следующим решением:
Это решение очень специфично для моей ситуации, но, возможно, оно даст вам некоторые идеи.
Вы сталкиваетесь с распространенной ловушкой WPF, которую чаще всего называют «проблемой воздушного пространства». Возможное решение - НЕ использовать элемент управления WebBrowser, а вместо этого пойти на что-то более безумное, а именно на рендеринг встроенного браузера WebKit непосредственно в WPF. Для этого есть два пакета; Awesomonium (коммерческий) и Berkelium (открытый). Для обоих есть оболочка .NET.
Мне удалось решить эту проблему, используя эту структуру, проверьте конфигурацию свойств в каждом элементе:
<Canvas ClipToBounds = "False">
<Popup AllowsTransparency = "True" ClipToBounds = "False" IsOpen = "True">
<Expander>
<Grid x:Name = "YourContent"/>
</Expander>
<Popup>
</Canvas>
Вам просто нужно управлять Expander, чтобы показать или скрыть ваш контент, я использую его для строки меню, я думаю, что Expander не является обязательным в зависимости от случая.
Посмотрите на это изображение с результатом, вы даже можете показать свои элементы управления поверх WebBrowser и даже за пределами главного окна:

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