当内容为可变高度时,列表框滚动条缩略图会更改大小

时间:2009-06-10 16:05:55

标签: c# wpf listbox itemscontrol

我有一个ListBox,其中显示了许多对象,每个对象可以是一个可变高度,基于每个对象具有的值的数量。 See my previous question that was answered here.

许多对象是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将拉伸到内容大小。列表框还有Horizo​​ntalContentAlignmment = Stretch以确保这看起来正确。

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

注意:如果需要在另一个问题中提出这个问题,请告诉我,我会分开问题

3 个答案:

答案 0 :(得分:6)

为什么不关闭ListBox本身的任何大小限制,让它按内容大小并将其包装到ScrollViewer中,为后者设置合适的大小?

标记应如下所示:

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

如果以这种方式实现,我在滚动期间看不到拇指尺寸变化。

答案 1 :(得分:5)

在ListBox上设置ScrollViewer.CanContentScroll="False",这将禁用所谓的“逻辑滚动”,它会根据项目数而不是高度进行滚动(“物理滚动”)。

答案 2 :(得分:0)

禁用虚拟化或使ListBox中的项目具有相同的高度。如果您的项目少于100件,那么您可以在没有虚拟化的情况下生活。