ListView с вложенным Expander не разрушается - PullRequest
7 голосов
/ 30 ноября 2009

Этот вопрос такой же, как и этот вопрос без ответа .

Когда 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 секций, а Expander может иметь много объектов внутри внутреннего ListView .

Внешний ListView и Expander предназначен для замены TreeView , который использовался для создания списка складных узлов, но TreeView * Внутреннее использование сеток 1051 * означает, что элементы TextView были сдвинуты по горизонтали, так же, как при удалении атрибутов ether HorizontalContentAlignment = "Stretch" .

Так что, если есть другой способ обернуть / связать все это, я тоже буду счастлив.

Это проблема, потому что наши TextView блоки большие и их много Expander s.

Редактировать: TextView используется, поскольку код привязан к данным и, таким образом, динамически объединяется. Таким образом, любая замена для ListView потребует некоторой формы ItemsSource

Ответы [ 2 ]

4 голосов
/ 30 ноября 2009

Нашли решение, и оно подробно, где в вопросе уже.

ItemControl принимает ItemsSource и автоматически изменяет размеры. Таким образом, замена двух ListView s на ItemControl s приводит к вложенному свертыванию.

Но прокрутки нет, поэтому обертывание внешнего 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.

2 голосов
/ 30 ноября 2009

Наиболее очевидная вещь, которую нужно сделать здесь, - это поместить расширители в контейнер, отличный от списка:

<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 легко изменять размер после его увеличения (помимо установки явных размеров всего объекта, что является неуклюжим и не полезно). Если это так, то, возможно, вам придется использовать управляемый список для отображения всех открытых расширителей или отображать содержимое другим способом (например, во всплывающем окне, может быть?), Если вы хотите, чтобы его можно было увидеть все с первого взгляда.

...