我有一个显示许多对象的列表框,每个对象的高度都可以是可变的,具体取决于每个对象具有的值的数量。请参阅我之前在这里回答的问题。
许多对象是 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 -
-------------------
注意:如果需要在不同的问题中提出这个问题,请告诉我,我会将问题分开