Domanda

Sto cercando di capire perché il controllo non onora ZIndex.

Esempio 1 - che funziona bene

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

Esempio 2: che non funziona

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

Grazie, ed ed

È stato utile?

Soluzione

Sfortunatamente ciò accade perché il controllo WebBrowser è un wrapper attorno al controllo COM di Internet Explorer.Ciò significa che ottiene il proprio HWND e non consente a WPF di disegnarvi nulla.Presenta le stesse restrizioni dell'hosting di qualsiasi altro controllo Win32 o WinForms in WPF.

MSDN contiene ulteriori informazioni sull'interoperabilità WPF/Win32.

Altri suggerimenti

Ti stai imbattendo in una trappola comune di WPF, più comunemente chiamata "Il problema dello spazio aereo".Una possibile soluzione è NON utilizzare il controllo WebBrowser e optare invece per qualcosa di un po' più folle, vale a dire un browser WebKit incorporato che esegue il rendering direttamente su WPF.Ci sono due pacchetti che fanno questo;Awesomonium (commerciale) e Berkelium (open source).Esiste un wrapper .NET per entrambi.

Potresti SetWindowRgn per simulare l'area sovrapposta nascondendola come mostrato qui:

Ho risolto un problema simile in cui ospitavo un controllo WinForms di terze parti nella mia applicazione WPF.Ho creato un controllo WPF che esegue il rendering del controllo WinForms in memoria e quindi lo dipinge su una bitmap.Quindi utilizzo DrawImage nel metodo OnRender per disegnare il contenuto sottoposto a rendering.Alla fine ho instradato gli eventi del mouse dal mio controllo al controllo ospitato.Nel caso di un browser web dovresti instradare anche gli eventi della tastiera.

Il mio caso era abbastanza semplice: un grafico con una semplice interazione con il mouse.Un controllo del browser Web potrebbe presentare altri problemi che non ho preso in considerazione.Comunque spero che questo aiuti.

Ho toccato anche questo problema.Nel mio caso trascinavo le immagini da un pannello al browser Web, ma ovviamente non appena l'immagine veniva spostata nel browser veniva nascosta.

Attualmente sto lavorando alla seguente soluzione:

  1. Quando inizia il trascinamento dell'immagine, crea una bitmap del browser Web utilizzando "RenderTargetBitmap"
  2. Aggiungi la tua bitmap alla tela, utilizzando la stessa larghezza/posizione del browser web
  3. webControl.Visibility = Visibility.Hidden.
  4. Quando il trascinamento viene rilasciato, rimuovi la bitmap e imposta webControl.Visibility = Visible.

Questa soluzione è molto specifica per la mia situazione, ma forse ti darà qualche idea.

Sono riuscito a risolvere questo problema utilizzando questa struttura, controlla la configurazione delle proprietà in ciascun elemento:

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

Devi solo gestire l'espansore per mostrare o nascondere i tuoi contenuti, io lo utilizzo per una barra dei menu, penso che l'espansore sia facoltativo a seconda dei casi.

Dai un'occhiata a questa immagine e il risultato è che puoi anche mostrare i tuoi controlli nella parte superiore del browser Web e anche all'esterno della finestra principale:

enter image description here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top