[英]Listbox scrollbar thumb changes size when content is variable height
我有一個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 - -------------------
注意:如果需要在另一個問題中詢問,請告訴我,我會分開問題
為什么不關閉ListBox本身的任何大小限制,讓它大小為內容並將其包裝到ScrollViewer中,為后者設置合適的大小?
標記應如下所示:
<ScrollViewer Width="640px" Height="480px">
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<!--Visualization of a list item-->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
如果以這種方式實現的話,我在滾動期間看不到拇指大小的變化。
在ListBox上設置ScrollViewer.CanContentScroll="False"
,這將禁用所謂的“邏輯滾動”,它根據項目數而不是高度(“物理滾動”)進行滾動。
禁用虛擬化或使ListBox中的項目具有相同的高度。 如果您的項目少於100件,那么您可以在沒有虛擬化的情況下生活。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.