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

Wil*_*ins 5 c# wpf listbox itemscontrol

我有一个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>
Run Code Online (Sandbox Code Playgroud)

这是在字段边缘周围绘制边框以进行可视分组,其中val将拉伸到内容大小.列表框还具有Horizo​​ntalContentAlignmment = Stretch以确保这看起来正确.

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

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

Dmi*_*nov 6

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

标记应如下所示:

    <ScrollViewer Width="640px" Height="480px">
        <ListBox>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <!--Visualization of a list item-->
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

如果以这种方式实现的话,我在滚动期间看不到拇指大小的变化.


Eri*_*ric 5

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