5

我有一个 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 将拉伸到内容大小。列表框还具有 Horizo​​ntalContentAlignmment = Stretch 以确保这看起来正确。

------------------
- var - opt - val -
- -------------
- - 选择 - 验证 -
- -------------
- - 选择 - 验证 -
------------------

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

4

3 回答 3

7

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

标记应如下所示:

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

如果以这种方式实现,我在滚动过程中看不到拇指大小的变化。

于 2009-06-15T20:19:24.240 回答
5

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

于 2009-06-18T06:10:34.780 回答
0

禁用虚拟化或使 ListBox 中的项目高度相同。如果您的项目少于 100 个左右,您可以不用虚拟化。

于 2009-06-11T04:55:10.297 回答