WPF Bug清单之(13)——应该出现却没有出现的ListView水平滚动条
2010-03-17 18:22
507 查看
我们知道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>
运行效果如下图所示:
![](http://images.cnblogs.com/cnblogs_com/nankezhishi/WPFBug/ListViewScrollBar/ListViewScrollBarBug.png)
这可能是我发现过的问题本身最简单,但是解决起来很复杂的一个Bug了。
问题出在什么地方呢?仔细分析ListView的XAML Structure,如下图:
![](http://images.cnblogs.com/cnblogs_com/nankezhishi/WPFBug/ListViewScrollBar/ListViewTemplate.png)
在ListView的Template里,我们看到ScrollViewer里没有HeaderPresenter,而只有ItemsPresenter。那么HeaderPresenter在什么地方呢?没有错,就在ScrollViewer里。如下图所示。
![](http://images.cnblogs.com/cnblogs_com/nankezhishi/WPFBug/ListViewScrollBar/ListViewScrollViewerTemplate.png)
问题就出在这里,放在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有提供)。解决方案下回讲解。(如果我能在自己能接受的时间内实现出来的话……)
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>
运行效果如下图所示:
![](http://images.cnblogs.com/cnblogs_com/nankezhishi/WPFBug/ListViewScrollBar/ListViewScrollBarBug.png)
这可能是我发现过的问题本身最简单,但是解决起来很复杂的一个Bug了。
问题出在什么地方呢?仔细分析ListView的XAML Structure,如下图:
![](http://images.cnblogs.com/cnblogs_com/nankezhishi/WPFBug/ListViewScrollBar/ListViewTemplate.png)
在ListView的Template里,我们看到ScrollViewer里没有HeaderPresenter,而只有ItemsPresenter。那么HeaderPresenter在什么地方呢?没有错,就在ScrollViewer里。如下图所示。
![](http://images.cnblogs.com/cnblogs_com/nankezhishi/WPFBug/ListViewScrollBar/ListViewScrollViewerTemplate.png)
问题就出在这里,放在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有提供)。解决方案下回讲解。(如果我能在自己能接受的时间内实现出来的话……)
相关文章推荐
- WPF Bug清单之(13)——应该出现却没有出现的ListView水平滚动条
- [WPF Bug清单]之(4)——点击RadioButton的空白没有反应
- [WPF]解决ListView在没有Items时,水平滚动条不出现的问题
- [WPF]解决ListView在没有Items时,水平滚动条不出现的问题
- Android中解决复写ListView时出现OnScollListener无法监听,这时如果实现标题栏渐变色的话,应该将计算滚动距离的方法,写在不断调用的回调中。
- ScrollView+ListView滚动冲突,没有滑动效果 解决办法
- 水平方向滚动的listview
- 无限上拉下拉XlistView 有时候就会出现 适配器内容已经改变,但列表视图没有收到通知。求解,为什么!内有详细说明。
- ListView滚动时item背景出现黑色问题
- 13_android项目中记录ListView滚动停止位置与设置显示位置
- [WPF Bug清单]之(3)——暗中创建文件的打开文件对话框
- WPF中ListView在不滚动数据的情况下只能取到当前显示的数据,取不到滚动条以下的数据解决方法
- Android scrollview里面放listview 滚动出现的问题:只滚listview不滚scrollview
- WPF下Listbox水平排列并平滑滚动
- 15.VC(ui)-listctrl绘制(解决水平滚动文字重影bug)
- [WPF Bug清单]之(5)——隐藏模态对话框后变成非模态
- [WPF Bug清单]之(7)——顽固的Error Template
- Android;sql数据库:关于删除数据库数据无法刷新listview并且新listview的修改增加功能出现bug的问题
- android listview 水平滚动和垂直滚动的小例子
- [WPF Bug清单]之(9)——消失的光标