Большой палец полосы прокрутки списка меняет размер, когда содержимое переменной высоты - PullRequest
5 голосов
/ 10 июня 2009

У меня есть ListBox с множеством отображаемых объектов, каждый из которых может иметь переменную высоту, в зависимости от количества значений, которые имеет каждый объект. См. Мой предыдущий вопрос, на который был дан ответ.

Многие объекты имеют высоту 5 строк, а другие - 1. Полоса прокрутки в ListBox, похоже, не нравится, возможно, из-за виртуализации. При прокрутке большой палец на полосе прокрутки изменит свой размер в зависимости от того, сколько предметов в действительности помещается в поле в данный момент. Это иногда делает большой палец большим, а иногда очень маленьким.

Поскольку этот ListBox также содержится в TabControl, при переключении с одной вкладки на другую ListBox часто прокручивается в другой раздел, когда вы возвращаетесь к нему.

Есть идеи, как решить проблему, подобную этой?

Дополнительная информация: Отключение виртуализации устраняет проблему с прокруткой, но за счет более медленного начального отображения. Однако изменение размера ListBox с содержимым внутри приводит к некоторой большой задержке при изменении размера по горизонтали (по вертикали это нормально), что, как я предполагаю, связано с изменением ширины моего шаблона и требует перерисовки для каждого элемента:

<DataTemplate DataType="{x:Type xmlset:Variable}">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="170"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Border BorderThickness="1,0,0,1" BorderBrush="Black">
            <TextBlock Margin="2,2,0,2"  Text="{Binding Path=Identifier.Name, Mode=OneWay}"/>
        </Border>
        <ItemsControl IsTabStop="False" Grid.Column="1" ItemsSource="{Binding Path=Values, Mode=OneWay}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="120"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <Border Grid.Column="0" BorderThickness="1,0,0,1" BorderBrush="Black">
                            <TextBlock Margin="2,2,0,2" Text="{Binding Path=Optimization, Mode=OneWay}"/>
                        </Border>
                        <Border Grid.Column="1" Width="Auto" BorderThickness="1,0,1,1" BorderBrush="Black">
                            <TextBox Margin="0,2,0,2" BorderThickness="0" Text="{Binding Path=Value}" TextChanged="TextBox_TextChanged"/>
                        </Border>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</DataTemplate>

Это рисование границ по краям полей для создания визуальной группировки, где val будет растягиваться до размера содержимого. У списка также есть HorizontalContentAlignmment = Stretch, чтобы гарантировать, что это выглядит правильно.

-------------------
- var - opt - val -
-     -------------
-     - opt - val -
-     -------------
-     - opt - val -
-------------------

примечание: если это нужно задать другим вопросом, скажите мне, и я разделю вопросы

Ответы [ 3 ]

6 голосов
/ 16 июня 2009

Почему бы не отключить какие-либо ограничения на размер самого ListBox, разрешить его размер в соответствии с содержимым и обернуть его в ScrollViewer, установив правильный размер для последнего?

Разметка должна выглядеть следующим образом:

    <ScrollViewer Width="640px" Height="480px">
        <ListBox>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <!--Visualization of a list item-->
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </ScrollViewer>

Я не видел изменений размера большого пальца во время прокрутки, если он был реализован таким образом.

5 голосов
/ 18 июня 2009

Установите ScrollViewer.CanContentScroll="False" в ListBox, это отключит так называемую «логическую прокрутку», которая выполняет прокрутку на основе количества элементов вместо высоты («физическая прокрутка»).

0 голосов
/ 11 июня 2009

Отключите виртуализацию или сделайте элементы в вашем ListBox одинаковой высоты. Если у вас есть менее 100 предметов или около того, вы можете жить без виртуализации.

...