2011-12-19 6 views
2

J'essaie d'ajouter un contrôle de contenu dans une arborescence, mais lorsque j'ajoute des éléments treeview dans le contrôle de contenu, ils sont alignés plus loin des autres éléments de treeview.ContentControl dans un WPF TreeView

<TreeView> 
    <TreeViewItem Header="XXX-1"></TreeViewItem> 
    <TreeViewItem Header="XXX-2"></TreeViewItem> 
    <ContentControl> 
     <TreeViewItem Header="YYY-1"></TreeViewItem> 
    </ContentControl>    
    <TreeViewItem Header="XXX-3"></TreeViewItem> 
</TreeView> 

Le code ci-dessus donne une vue arborescente comme ci-dessous.

 
XXX-1 
XXX-2 
    YYY-1 
XXX-3 

Je pense que ContentControl ajoute un autre TreeViewItem par lui-même. Comment puis-je aligner TreeViewItems ensemble?

+1

Quel est l'objectif de l'ajout de TreeViewItem à ContentControl? – Josh

+0

@Josh: S'il vous plaît voir le commentaire que j'ai écrit à Orchestrator. – exoz

+0

mettez une réponse ci-dessous qui devrait fonctionner pour vous. – Josh

Répondre

2

Vous pouvez accomplir cela avec deux DataTemplates et un ItemTemplateSelector affecté à la propriété ItemTemplateSelector de TreeViewItem.

Définissez vos types complexes et simples dans deux DataTemplates. Ensuite, écrivez une classe qui hérite de DataTemplateSelector qui détermine si le type complexe ou simple doit être utilisé dans TreeViewItem. Vous définissez ensuite ItemTemplateSelector TreeViewItem à l'objet DataTemplateSelector que vous venez de créer. Voici un exemple: http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplateselector.aspx.

Voici un autre lien qui vous montre comment sélectionner un DataTemplate basé sur une condition: http://msdn.microsoft.com/en-us/library/ms742521.aspx. Recherchez l'en-tête Choix d'un DataTemplate en fonction des propriétés de l'objet de données.

0

Il fait nid ContentControl dans un TreeViewItem (voir capture d'écran ci-dessous Snoop)

Snoop me dit aussi que la marge supplémentaire est le +/- Expander, de sorte que vous aurez probablement à remplacer le modèle pour obtenir débarrassez-vous de cette marge si vous souhaitez conserver vos TreeViewItems imbriqués.

enter image description here

Bien sûr, si vous êtes tout simplement essayer de placer un ContentControl dans votre TreeViewItem, les balises doivent être l'inverse. Je voudrais commencer par la réponse de Rachel mais supprimer le ContentControl.

<TreeViewItem Header="YYY-1"> 
    <ContentControl /> 
</TreeViewItem> 
+0

Que voulez-vous dire en écrasant le modèle? Est-il possible de modifier le rendu de ContentTemplate à l'intérieur d'un TreeView afin qu'il agisse seulement comme un espace réservé? Btw je ne connaissais pas le Snoop, c'est un outil très pratique merci. – exoz

+0

@ user1106026 Par défaut, les contrôles WPF sont "sans apparence", ce qui signifie que la façon dont ils apparaissent à l'écran n'est pas définie dans le contrôle lui-même. Au lieu de cela, WPF utilise des modèles pour déterminer comment dessiner des objets d'interface utilisateur sur l'écran et ces modèles peuvent être remplacés. Par exemple, la capture d'écran Snoop montre que le 'TreeViewItem' est dessiné comme un' Grid' contenant un 'Expander' et un' Border', et 'Border' contient le' ContentPresenter'. Vous pouvez écraser cela pour ne dessiner que le 'ContentPresenter' – Rachel