WPF Bug清单之(13)——应该出现却没有出现的ListView水平滚动条

我们知道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有提供)。解决方 案下回讲解。(如果我能在自己能接受的时间内实现出来的话……)

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索listview
, bug
, scrollviewer
, scrollview
, listview界面问题
, 滚动
, header
, listview滚动条
, listview问题
, 加入scrollview不显示
, 水平滚动条
, listview 滚动同步
, 滚动动画scrollviewer
水平
wpf listview 滚动条、wpf 滚动条bug、listview去掉滚动条、listview 滚动条、listview滚动条不显示,以便于您获取更多的相关知识。

时间: 2024-08-04 05:20:12

WPF Bug清单之(13)——应该出现却没有出现的ListView水平滚动条的相关文章

WPF Bug清单(序)与之(1)——可以多选的单选ListBox

从.NET 3.0发布至今,.NET Framework相继发布了.NET 3.5和.NET3.5 SP1.其间做了两个基于WPF的项目.发现现在的WPF的BUG真的是不算少.给程序的开发带来了不少的困扰--为了避开BUG,而不得不多写很多代码. 这个"WPF BUG清单"系列,将列出笔者在项目中遇到过的WPF的各种问题,也许不一定是BUG,但是会造成开发上的不便.更感觉WPF的第一次发布实在有赶鸭子上架的嫌疑.很多东西都还没有做就发布了.(跟Silverlight 1.0一样) 先举

WPF Bug清单之(4)——点击RadioButton的空白没有反应

在WPF BUG清单之二,介绍过RadioButton在绑定上的一个Bug.现在再来介绍它的另一个造成RadioButton的点击事件处理不正确的BUG.现象是:点在RadioButton的范围内,可这个RadioButton就是选不中. 先来看一个例子.Windows里一个常见的对话框,用了多个RadioButton.如下图所示. 图1.RadioButton使用范例 把RadioButton放在GroupBox的Header上,是很常见的一个用例,而且被微软的UX Guide所认可. 大家可

WPF Bug清单之(12)

WPF Bug清单之(12)--与自定义Attached Property相关的Binding Path运行时错误 我们都知道DataBinding的格式是这样的: {Binding Path=PropertyName} 其中的Path=这几个字是可以省略的.从而简写成: {Binding PropertyName} 这个行为也在MSDN上面特别介绍过. 本文所指"解析错误"是指:当Property是自定义的AttachedProperty时, 第二种写法会产生运行时错误.如下代码所示

WPF Toolkit Chart实现的线型图标题和纵轴在拉动水平滚动条右移时如何使纵轴固定左边,即一直显示出来?

问题描述 WPFToolkitChart实现的线型图,在拉动水平滚动条使图标右移时,如何把Chart图表的title标题和纵轴一直显示在布局控件的左边?菜鸟刚接触WPF,理解不是很深,又遇到这到高深的需求问题,在此肯请高手和大侠出手相助,多多给点意见或建议.菜鸟不胜感激...

WPF Bug清单之(2)——RadioButton的IsChecked绑定失效

.NET Framework已经算是一个很易用的库了.可以自动地为我们做很多事情,而且大都做得还不错.但是自动完成的事情很可能会有隐患,因为Framework本身是并不了解业务逻辑的.它自动完成的事情,可能会给我们帮倒忙. RadioButton就是其中一个. 先来从设置值的角度介绍一下WPF里的Dependency Property(以下简称DP).在WPF里控制一个控件的DP,有太多的方式.可以用Style,可以用Animation,可以用Data Binding,可以用Trigger,还有

WPF Bug清单之(11)——错位的RenderTransform动画

在WPF中制作位移类动画大致有3种方式,Margin.RenderTransform和 LayoutTransform.虽然3者的效果略有不同,但是不少情况下3种方式可以通用 .但是当你了解到RenderTransform所存在的Bug时,可能就需要考虑一番了. 我们都知道很多控件都有FocusVisualStyle,一般就是一个虚线框. RenderTransform的问题就在于, 控件的FocusVisualStyle中的元素,不会随着 控件本身一起被Transform. Bug的重现过程如

WPF Bug清单之(8)——RowDefinition中MaxHeight在一定条件下失效

再下一城. BUG描述:当RowDefinition的Height属性被设置为Auto时,MaxHeight将不会对这个Row的Height起到限制作用. Bug发现过程:想做一个像Visual Studio 2008里Error List一样的东西.平时自动占用最小的空间,可以在适当的时候自己弹出来,但是又不要弹得过高. 示例窗口代码如下: Demo Window <Window x:Class="InvaliMaxHeight.DemoWindow" xmlns="

WPF Bug清单之(6)——Button的IsCancel属性失效

在上一篇中,描述了模态对话框隐藏之后变成了非模态的Bug,很多人回复表示这不算是一个Bug,我也表示理解.Bug只有在需求之下才有意义,不同的需求,对Bug的界定也不一样.作为一个Framework,.NET只能做到在多数时候是符合最广泛群体的需求的,就可以说它合格.但是对于前一篇描述的问题,想补充一下自己的考虑. Window的Show和ShowDialog,用于将窗体展现(我没有用显示)出来,而Close用于关闭.Close之后就不能再用Show或是ShowDialog再次将窗体展现出来,否

WPF Bug清单之(5)——隐藏模态对话框后变成非模态

发现这个问题时,隐约记得之前有人已经发过这个问题,想把链接放到这里,不过找了半天,实在找不到.日后如果找到了一定加上. 问题描述:用ShowDialog方法弹出一个模态对话框,然后将此对话框的Visibility属性设置为Hidden,再设置回Visible,发现这个对话框已经不是模态的了. 有人会觉得关就关了得了,也不会有这个问题,干什么要把Close取消掉然后再显示出来呢?因为这是有应用环境的. 应用环境:有些对话框,从逻辑上就是单例的,比如Office和Visual Studio里都有的查