快捷搜索:

WPF Bug清单之(13)——应该出现却没有出现的L

我们知道ListView在内容越过控件本身范围时,默认会把滚动条显示出来。这个内容,显然应该包括Head和Items两个部分。无论哪个部分越过了,都应该把水平滚动条显示出来。

ListView的Bug就在于,当ListView中没有Item,且Headr的总长跨越ListView本身时,水平滚动条没有呈现。

这个Bug很好重现。代码如下:

Grid x:Name="LayoutRoot">

ListView Width="100">

ListView.View>

GridView>

GridViewColumn Header="Name"/>

GridViewColumn Header="Value"/>

GridViewColumn Header="Length"/>

GridViewColumn Header="Format"/>

GridViewColumn Header="Error Information"/>

GridView>

ListView.View>

ListView>

Grid>

运行效果如下图所示:

这可能是我发明过的问题本身最简单,然则办理起来很繁杂的一个Bug了。

问题出在什么地方呢?仔细阐发ListView的XAML Structure,如下图:

在ListView的Template里,我们看到ScrollViewer里没有HeaderPresenter,而只有ItemsPresenter。那么HeaderPresenter在什么地方呢?没有错,就在ScrollViewer里。如下图所示。

问题就出在这里,放在ScrollViewer的Template里的HeaderPresenter,并不属于必要被Scroll的Content。以是当Header越过范围时,ScrollViewer的ScrollBar并不会呈现。至于为什么微软要把HeaderPresenter放在ScrollViewer的Template里?

想想滚动垂直滚动条的时刻,是不是只有Items滚动?而Header不停在最上面?假如把Header作为Content,那么Header也会跟着Items不停滚动了。这是一个比超长Header水平滚动条不呈现更大年夜的一个Bug。以是在WPF现有的Control Sets的约束下,只能这样子。

然则水平滚动条在没有Items时不呈现,依然是一个Bug。这个Bug的办理法子相称繁杂,必要有Selective Scrolling的功能(WPF Toolkit有供给)。办理规划下回解说。(假如我能在自己能吸收的光阴内实现出来的话……)

您可能还会对下面的文章感兴趣: