2008-09-17 3 views
10

Я пытаюсь понять, почему контроль не чтит ZIndex.WPF 3.5 Управление WebBrowser и 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

ответ

21

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

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

1

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

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

3

Вы можете SetWindowRgn фальсифицировать перекрытием, скрывая его, как показано здесь:

+1

@Ricky - Спасибо за критику. Я постараюсь не злоупотреблять этим словом в будущем. Я стараюсь избегать использования словарного метода при обсуждении программирования из-за двусмысленности со словом method при использовании в контексте объектно-ориентированного программирования. Интересно, есть ли лучшее слово. – jpierson 2011-03-24 14:30:50

3

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

+4

Мне не нравятся всплывающие окна, поскольку они, как правило, остаются на вашем экране, даже если вы переключаетесь на другое приложение, и они, похоже, не привязаны к вашему приложению, поэтому, когда вы изменяете размер/перемещаете свое приложение, всплывающее окно не перемещается с Это. – Rachel 2010-10-13 17:55:51

1

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

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

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

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

4

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

1

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

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

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

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

enter image description here

Смежные вопросы