Pergunta

Eu estou tentando descobrir por que o controle não honrar ZIndex.

Exemplo 1 - que funciona bem

   <Canvas>
       <Rectangle Canvas.ZIndex="1" Height="400" Width="600" Fill="Yellow"/>
       <Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/>
   </Canvas>

Exemplo 2 - que não funciona

   <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>

Obrigado, - Ed

Foi útil?

Solução

Infelizmente, isso ocorre porque o controle WebBrowser é um invólucro em torno do controle Internet Explorer COM. Isso significa que ele recebe o seu próprio HWND e não permite WPF para desenhar qualquer coisa sobre ele. Ele tem as mesmas restrições que hospedando qualquer outro controle Win32 ou WinForms em WPF.

MSDN tem mais informações sobre WPF / Win32 de interoperabilidade.

Outras dicas

Você está executando em uma armadilha WPF comum, mais comumente chamado de "O espaço aéreo problema". Uma possível solução é não usar o controle WebBrowser, e em vez de ir para algo um pouco mais louco - ou seja, um navegador WebKit incorporado renderização diretamente para WPF. Há dois pacotes que fazem isso; Awesomonium (comercial) e Berkelium (open-source). Há uma .NET wrapper para ambos.

Você poderia SetWindowRgn de falsificar a área de sobreposição escondendo-o como mostrado aqui:

Eu resolvi um problema semelhante onde eu estava hospedando uma 3ª controle WinForms partido no meu aplicativo WPF. Eu criei um controle WPF que torna o controle WinForms na memória e, em seguida, pinta-lo para um bitmap. Então eu uso DrawImage no método OnRender para desenhar o conteúdo processado. Finalmente eu encaminhado eventos de mouse do meu controle para o controle hospedado. No caso de um navegador web, você também teria de eventos de teclado rota.

O meu caso foi bastante fácil - uma tabela com alguma interação simples mouse. Um controle de navegador web pode ter outros problemas que eu não levar em consideração. Enfim, espero que ajuda.

Eu bati esta questão também. No meu caso eu estava arrastando imagens de um painel para o WebBrowser, mas é claro que, logo que a minha imagem mudou para o navegador estava escondido.

Atualmente trabalhando na seguinte solução:

  1. Quando o arrasto Imagem começa, criar um Bitmap do WebBrowser utilizando "RenderTargetBitmap"
  2. Adicione o seu Bitmap para a tela, usando a mesma largura / localização como o webbrowser
  3. webControl.Visibility = Visibility.Hidden.
  4. Quando o arrasto é liberado, retire o bitmap e conjunto webControl.Visibility = visível.

Esta solução é muito específico para a minha situação, mas talvez ele vai te dar algumas ideias.

Eu consegui resolver isso usando essa estrutura, consulte a configuração de propriedades em cada elemento:

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

Você apenas tem que gerir o Expander para mostrar ou ocultar o seu conteúdo, eu estou usando-o para uma barra de menu, eu acho que o expansor é opcional, dependendo do caso.

Confira esta imagem com o resultado, você pode até mostrar seus controles em cima do WebBrowser e até mesmo fora da janela principal:

enter descrição da imagem aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top