ListView con Expander nidificato non compresso
Domanda
Questa domanda è uguale all'altra domanda senza risposta .
Quando Expander viene espanso il ListView esterno cresce per fare spazio ai contenuti degli espansori, ma quando Expander viene quindi compresso la vista non impone il ridimensionamento di ListView.
Codice ridotto, con note dopo:
<!--<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>-->
Ho il ParameterGroupView in un ItemsControl o StackPanel perché in realtà ci sono molte voci ParameterGroupView . Lo scambio con un StackPanel non cambia il comportamento.
La rimozione del Boarder non influisce sul comportamento, ma averlo aiuta a mostrare il comportamento con un solo ParameterGroupView .
Ci possono essere molte sezioni Expander nel ListView esterno e Expander può avere molte entità all'interno del ListView
Il ListView e Expander esterni devono sostituire un TreeView , utilizzato per avere un elenco di nodi comprimibili, ma il L'uso interno delle griglie di TreeView significa che gli elementi TextView sono stati schiacciati in modo orizzontale, come se si rimuovessero gli attributi etere HorizontalContentAlignment = " Stretch " .
Quindi, se c'è un altro modo per avvolgere / cablare tutto questo, sarò anche felice.
Questo è un problema perché i nostri blocchi TextView sono grandi e ci sono molti Expander .
Modifica: TextView viene utilizzato in quanto il codice è associato ai dati e quindi assemblato dinamicamente. Quindi qualsiasi sostituzione per ListView avrebbe bisogno di una qualche forma di ItemsSource
Soluzione
Trovato la soluzione, che specifica già dove si trova la domanda.
ItemControl accetta un ItemsSource e si ridimensiona automaticamente. Quindi sostituendo i due ListView con ItemControl si ottiene il collasso nidificato.
Ma non c'è scorrimento, quindi avvolgendo ItemControl esterno con un ScrollViewer , viene riprodotto l'effetto desiderato completo.
<ScrollViewer
VerticalScrollBarVisibility="Auto">
<ItemsControl>
<!-- ParameterGroupView -->
<Border
BorderBrush="Brown"
BorderThickness="1"
CornerRadius="4"
Padding="4"
Height="Auto">
<ItemsControl
HorizontalContentAlignment="Stretch">
<Expander
Header="Expander A"
IsExpanded="False">
<ItemsControl
HorizontalContentAlignment="Stretch">
<!-- TextView -->
<TextBlock>Content A</TextBlock>
<TextBlock>Content B</TextBlock>
</ItemsControl>
</Expander>
</ItemsControl>
</Border>
</ItemsControl>
</ScrollViewer>
Stavo testando con doppie espansioni nelle sezioni Border e Double Border.
Altri suggerimenti
La cosa più ovvia da fare qui è mettere gli espansori in un contenitore diverso da una lista:
<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>
Il contenitore si ridimensiona bene attorno al contenuto.
Se devi assolutamente averlo in un ListView (che è possibile), allora non conosco un modo per far ridimensionare facilmente un ListView una volta cresciuto (oltre a impostare dimensioni esplicite di tutto, che è goffo e inutile). In tal caso, è possibile che dovrai utilizzare una casella di riepilogo controllabile per visualizzare tutti gli espansori aperti o visualizzare il contenuto in un modo diverso (come in un popup, forse?) Se vuoi essere in grado di vederlo tutto a colpo d'occhio.