Question

J'essaie de comprendre pourquoi le contrôle ne respecte pas ZIndex.

Exemple 1 - qui fonctionne bien

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

Exemple 2 - qui ne fonctionne pas

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

Merci, - Ed

Était-ce utile?

La solution

Malheureusement, cela est dû au fait que le contrôle WebBrowser encapsule le contrôle COM d’Internet Explorer. Cela signifie qu'il obtient son propre HWND et ne permet pas à WPF de dessiner quoi que ce soit par dessus. Il a les mêmes restrictions que l’hébergement de tout autre contrôle Win32 ou WinForms dans WPF.

MSDN contient davantage d'informations sur l'interopérabilité WPF / Win32.

Autres conseils

Vous rencontrez un écueil WPF commun, plus communément appelé "Le problème de l'espace aérien". Une solution possible consiste à NE PAS utiliser le contrôle WebBrowser, mais plutôt opter pour quelque chose d'un peu plus fou, à savoir un navigateur WebKit intégré rendu directement à WPF. Il y a deux paquets qui le font; Awesomonium (commercial) et Berkelium (open source). Il existe un wrapper .NET pour ces deux applications.

Vous pouvez définirWindowRgn pour simuler la zone de chevauchement en la masquant comme indiqué ici:

J'ai résolu un problème similaire en hébergeant un contrôle WinForms tiers dans mon application WPF. J'ai créé un contrôle WPF qui restitue le contrôle WinForms en mémoire, puis le peint en bitmap. Ensuite, j'utilise DrawImage dans la méthode OnRender pour dessiner le contenu rendu. Enfin, j'ai acheminé les événements de souris de mon contrôle au contrôle hébergé. Dans le cas d'un navigateur Web, vous devrez également router les événements de clavier.

Mon cas était assez simple: un graphique avec quelques interactions simples avec la souris. Un contrôle de navigateur Web peut avoir d’autres problèmes que je n’ai pas pris en compte. En tout cas j'espère que ça aide.

Je frappe aussi ce problème. Dans mon cas, je glissais des images d'un panneau vers WebBrowser, mais bien sûr, dès que mon image est entrée dans le navigateur, elle est masquée.

Travaille actuellement sur la solution suivante:

  1. Lorsque le glissement d'image commence, créez une bitmap du navigateur Web à l'aide de "RenderTargetBitmap" "
  2. .
  3. Ajoutez votre bitmap à la toile en utilisant la même largeur / le même emplacement que le navigateur Web
  4. webControl.Visibility = Visibility.Hidden.
  5. Lorsque le glisser est relâché, supprimez votre bitmap et définissez webControl.Visibility = Visible.

Cette solution est très spécifique à ma situation, mais elle vous donnera peut-être quelques idées.

J'ai réussi à résoudre ce problème en utilisant cette structure. Consultez la configuration des propriétés dans chaque élément:

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

Il vous suffit de gérer Expander pour afficher ou masquer votre contenu, je l’utilise pour une barre de menu, je pense que l’expander est facultatif selon le cas.

Regardez cette image avec le résultat, vous pouvez même afficher vos commandes en haut du navigateur Web et même en dehors de la fenêtre principale:

entrer la description de l'image ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top