【问题标题】:Listbox scrollbar thumb changes size when content is variable height当内容是可变高度时,列表框滚动条拇指会改变大小
【发布时间】:2009-06-10 16:05:55
【问题描述】:

我有一个列表框,其中显示了许多对象,每个对象都可以是可变高度,具体取决于每个对象具有的值的数量。 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 - - ------------- - - 选择 - 验证 - - ------------- - - 选择 - 验证 - ------------------

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

【问题讨论】:

    标签: c# wpf listbox itemscontrol


    【解决方案1】:

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

    标记应如下所示:

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

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

    【讨论】:

    • 如果滚动查看器要填满一个窗口,有没有办法让它工作?这确实解决了拇指大小问题,但是由于自动宽度和高度,调整窗口大小非常非常慢。
    • 是的。 ScrollViewer 就像任何其他控件一样填充父控件,就像这样。 而且拇指还是可以的。你的意思是哪个调整性能?在我在普通笔记本电脑上运行的测试程序中,包含 200 项调整窗口大小的列表,所有内容看起来都是即时的。
    • 我遇到了水平滚动问题,因为 DataTemplate 在拉伸时会在每个元素上重绘。我在 TabItem 中以编程方式创建 ListBox。请参阅更新的问题。当 Horizo​​ntalContentAlignment=Stretch without virtualization 时,这总是一个缺点吗?
    • 如果延迟的原因真的是计算宽度,那么试试这个。以编程方式处理 ListBox 的 resize 事件,在处理程序内部获取实际宽度,由于拉伸对齐而预先自动设置,关闭拉伸对齐并显式设置该宽度。
    • 重要补充:在虚拟化 ListBox 的情况下,将 ListBox 放在 ScrollViewer 包装器中会降低性能。这种降级的原因很简单:ScrollViewer 将强制其子内容首先呈现,因此在 ListBox 中有成百上千的项目将是长时间的停顿数秒。
    【解决方案2】:

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

    【讨论】:

    • 这也会禁用虚拟化,使其与 ScrollViewer 中的 ListBox 相同
    • 您必须进行自定义实现才能解决此问题;正常的物理滚动需要计算的总高度。 (滚动条拇指大小基于当前可见高度相对于总高度)
    • 可能是个愚蠢的问题,但你如何在列表框上设置它?我可以将列表框包装在滚动查看器中,但这会破坏滚轮,所以我需要这样做...
    • 这是一个愚蠢的问题 :) &lt;ListBox ScrollViewer.CanContentScroll="False"
    【解决方案3】:

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

    【讨论】:

    • 我有大约 200 件商品。我尝试通过使 ItemsPanelTemplate 成为 StackPanel 来禁用虚拟化,我发现它最初加载速度较慢,但​​随后滚动速度更快。但是,滚动条仍然不断改变大小,所以这并不能解决问题。如果没有必要,我宁愿不更改项目大小,但它开始看起来像我可能的那样。
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 2018-11-16
    • 2021-01-26
    • 2021-10-31
    • 2021-03-23
    • 2018-07-09
    • 2018-01-27
    • 2017-10-31
    相关资源
    最近更新 更多