2009-06-18 11 views
0

Nous avons une application WPF qui a des fenêtres personnalisées sur un canevas qui à son tour contiennent des contrôles personnalisés (le canevas principal contenant les fenêtres personnalisées est de nouveau un contrôle personnalisé affichant des trucs). Donc, fondamentalement, l'arbre visuel ressemble à ceci (sans implicite frontières et d'autres choses):Drag & Drop-Adorner dans les arbres visuels profondément imbriqués

- Windows 
    - Canvas 
    - WindowMgr 
     - CustomWindow (maximized with z-index 0, functioning as background) 
     - ScrollPresenter 
      - CustomControl1 
     - CustomWindow 
     - ScrollPresenter 
      - CustomControl2 

Maintenant, nous avons besoin de faire glisser & déposer à partir de ces contrôles personnalisés à l'autre (généralement à partir d'une fenêtre mobile à la fenêtre d'arrière-plan). Pour montrer le drag & adorer un élément orné et une couche adorner est nécessaire. Habituellement, les exemples utilisent leur grille ou itemscontrol pour cela, et obtiennent également la couche adorner du même élément. Faire la même chose ici ne fonctionne pas puisque le ScrollPreseneter/CustomWindows clipent leur contenu, ce qui vous empêche de faire glisser hors de la fenêtre. Pour l'instant nous marchons dans l'arbre visuel jusqu'à ce que nous trouvions la toile de racine et l'utilisions comme élément orné, mais cela semble un peu sale (et comme nous l'avons expérimenté n'est pas très robuste).

Des suggestions sur une solution robuste pour cela?

Répondre

1

Si je lis bien votre question et que vous ne l'avez pas mentionné vous-même, vous cherchez peut-être le AdornerDecorator Class, qui fournit une couche de Adorner pour les éléments situés plus bas dans l'arbre visuel.

En supposant de son nom ScrollPresenter est dérivé de ContentPresenter, il convient de noter que pour la mise en œuvre des contrôles personnalisés avancés, vous voudrez peut-être entourer leur ContentPresenter par un AdornerDecorator, tout comme le Window Class ne, voir par exemple Don’t forget the AdornerDecorator pour un vrai travail agréable scénario impliquant glisser & chute aussi.

C'est, au moyen du AdornerDecorator vous assurer le nécessaire AdornerLayer à être contenu dans votre contrôle personnalisé, en supprimant d'où la nécessité de le récupérer ailleurs en marchant dans l'arbre visuel, par exemple:

<ControlTemplate TargetType="{x:Type CustomWindow}"> 
    <Border ...> 
     <Grid> 
      <AdornerDecorator> 
       <ScrollPresenter ... /> 
      </AdornerDecorator> 
     </Grid> 
    </Border> 
</ControlTemplate> 

En fonction de votre scénario particulier, vous aurez besoin d'un AdornerDecorator pour vos fenêtres personnalisées, vos contrôles personnalisés ou les deux. Pour plus de détails sur l'architecture adorner, voir Adorners Overview.