2009-11-30 10 views
7

Cette question est la même que cette autre unanswered question.ListView avec Expander imbriqué pas effondrement

Lorsque le l'extérieur Expander est élargi ListView pousse à faire de la place pour le contenu des expandeurs, mais quand le Expander est alors effondrés la vue ne force pas le ListView à redimensionner.

Code réduit, avec des notes après:

<!--<StackPanel>--> 
<ItemsControl> 

    <!-- ParameterGroupView --> 
    <Border BorderBrush="Brown" BorderThickness="1" CornerRadius="4" Padding="4"> 
    <ListView HorizontalContentAlignment="Stretch"> 
     <Expander Header="Expander A" IsExpanded="False"> 
     <ListView HorizontalContentAlignment="Stretch"> 

      <!-- TextView --> 
      <TextBlock >Content A</TextBlock> 
      <TextBlock >Content B</TextBlock> 

     </ListView> 
     </Expander> 

    </ListView> 
    </Border> 

</ItemsControl> 
<!--</StackPanel>--> 

J'ai la ParameterGroupView dans un ItemsControl ou StackPanel parce qu'il est en fait beaucoup ParameterGroupView entrées. L'échange vers un StackPanel ne change pas le comportement.

Retrait de la Boarder n'affecte pas le comportement, mais l'avoir permet de montrer le comportement avec un seul ParameterGroupView.

Il peut y avoir beaucoup de Expander sections dans la extérieure ListView et le Expander peut avoir de nombreuses entités à l'intérieur du ListView intérieur.

Le extérieur ListView et Expander est de remplacer une TreeView, qui a été utilisé pour avoir une liste de noeuds pliable, mais l'utilisation interne des grilles de TreeView, on entend les éléments de TextView ont été écrasés horizontalement, le même que si vous enlevez l'éther HorizontalContentAlignment = "Stretch" attributs. Donc, s'il y a une autre façon d'enrouler/câbler tout cela, je serai également heureux.

Ceci est un problème parce que nos blocs TextView sont grandes et il y a beaucoup de Expander s.

Édition: TextView est utilisé car le code est lié aux données, et donc mis ensemble dynamiquement. Ainsi, tout remplacement de ListView aurait besoin d'une certaine forme de ItemsSource

+0

Je ne voulais pas non plus de l'interaction de style ListView avec les éléments de contenu. Je voulais juste un contrôle de redimensionnement dynamique qui pourrait être lié aussi. –

Répondre

4

Trouvé la solution, et il détaille où dans la question déjà.

ItemControl accepte un ItemsSource et redimensionne automatiquement. Donc, en remplaçant les deux ListView s avec ItemControl s obtient le repliement imbriqué.

Mais il n'y a pas de défilement, l'emballage de sorte que le extérieur ItemControl avec un ScrollViewer, reproduit l'effet complet désiré. Je testais avec des Expanders doubles dans les sections Border et Double Border.

+0

Juste testé cela dans l'application actuelle, et cela résout le problème là aussi. –

2

La plus évidente chose à faire ici est de mettre les extenseurs dans un récipient autre qu'un listview:

<Border BorderBrush="Brown" BorderThickness="1" CornerRadius="4" Padding="4"> 
    <StackPanel> 

     <Expander Header="Expander A" IsExpanded="False"> 
      <ListView HorizontalContentAlignment="Stretch" MinWidth="100"> 
       <ListBox Name="listb"></ListBox> 

       <!-- TextView --> 
       <TextBlock >Content A</TextBlock> 
       <TextBlock>Content B</TextBlock> 

      </ListView> 
     </Expander> 
    </StackPanel> 
</Border> 

Le conteneur redimensionne autour d'un contenu juste bien.

Si vous devez absolument l'avoir dans un ListView (ce qui est possible) alors je ne connais pas un moyen de redimensionner facilement un ListView une fois qu'il a grandi (au-delà de définir des tailles explicites de l'ensemble, ce qui est maladroit et pas utile).Si c'est le cas, il est possible que vous deviez utiliser une listbox contrôlable pour afficher tous les expandeurs ouverts, ou afficher le contenu d'une manière différente (comme dans un popup, peut-être?) Si vous voulez pouvoir le voir tout d'un coup d'oeil.

+0

Oui, je suis d'accord le ListBox est en faute, mais j'en ai besoin, ou quelque chose comme ça, car il supporte ItemsSource, où-comme le StackPanel ne le fait pas. Mon système actuel est lié aux données complètes, pas statique. –