ListView с вложенным Expander не разрушается
Вопрос
Этот вопрос такой же, как и этот другой вопрос без ответа .
Когда Expander расширяется, внешний ListView увеличивается, чтобы освободить место для содержимого модулей расширения, но когда Expander затем свернул представление не заставляет ListView изменять размер.
Сокращенный код с примечаниями после:
<!--<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>-->
У меня есть ParameterGroupView в ItemsControl или StackPanel , потому что на самом деле есть много записей ParameterGroupView . Обмен на StackPanel не меняет поведение.
Удаление Границы не влияет на поведение, но наличие этого помогает показать поведение только с одним ParameterGroupView .
Во внешнем ListView может быть много разделов Expander , а внутри ListView может быть много сущностей. / EM>.
Внешние ListView и Expander предназначены для замены TreeView , который использовался для создания списка складных узлов, но Внутреннее использование сеток TreeView означает, что элементы TextView были сдвинуты по горизонтали, так же, как если бы вы удалили эфирные HorizontalContentAlignment = " Stretch " .
Так что, если есть другой способ обернуть / связать все это, я тоже буду счастлив. Р>
Это проблема, потому что наши блоки TextView большие, и имеется много Expander .
Редактировать: TextView используется, поскольку код привязан к данным и, таким образом, динамически объединяется. Поэтому для любой замены ListView потребуется какая-то форма ItemsSource
Решение
Нашел решение, и в нем уже уточняется, где уже находится вопрос.
ItemControl принимает ItemsSource и автоматически изменяет размеры. Таким образом, замена двух ListView на ItemControl приводит к вложенному свертыванию. Р>
Но прокрутки нет, поэтому обертывание внешнего ItemControl с помощью ScrollViewer воспроизводит полный желаемый эффект.
<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>
Я тестировал с двойными расширителями в разделах Border и Double Border. Р>
Другие советы
Самая очевидная вещь, которую нужно сделать здесь, - это поместить расширители в контейнер, отличный от списка:
<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>
Контейнер изменяет размер содержимого. Р>
Если вам абсолютно необходимо иметь его в ListView (что возможно), то я не знаю, как заставить ListView легко изменить размер после его увеличения (помимо установки явных размеров всего объекта, что является неуклюжим и не полезно). Если это так, то, возможно, вам придется использовать управляемый список для отображения всех открытых расширителей или отображать содержимое другим способом (например, во всплывающем окне, может быть?), Если вы хотите, чтобы его можно было увидеть все с первого взгляда.