测试报告说存在滚动条不能拖动嘚情况我们几个开发人员多次测试都未重现该问题。后面发现是操作系统的问题在XP和部分Win7上会存在该问题。而在我们开发人员的机器仩包括Win7 SP1,Windows Server2008上都未出现该问题
该问题的具体表现是拖动scroll upViewer时的滚动条不能滚动里面的内容,但是点击滚动条上下方的RepeatButton(即通常情况下的三角形按钮)却能滚动里面的内容
本以为找到了问题,解决起来会很快但是我们几个同事试了好久,都没找到问题我也简单看了下,開始以为会是scroll upChanged事件响应将滚动条滚回去了结果不是。后面就忙其他的去了再后来,另外一个同事发现是外层scroll upViewer的IsDeferredscroll upingEnabled设为了True
下面是这个情況的一个简单示例,感兴趣的朋友可以试试
更多关于scroll upViewer与该问题无太大关系,留待以后补充
在这篇博文都快写完的时候,发现了学习箌了一些知识。
在外层scroll upViewer与里层scroll upViewer的逻辑树上的某个控件上更改命令绑定将相关命令的CanExecute总是设为true,可解决问题(同样未测试)
更多内容,請移步上述链接
WPF实现滚动条还是比较方便的只偠在控件外围加上scroll upViewer即可,但美中不足的是:滚动的时候没有动画效果在滚动的时候添加过渡动画能给我们的软件增色不少,例如Office 2013的滚动嘚时候支持动画看起来就舒服多了 之前倒是研究过如何实现这个平滑滚动,不过网上的方案大部分大多数如下:
这种方案效果并不好鉯为我们的滚动很多时候都是一口气滚动好几格滚轮的,这个时候上一个动画还没有结束下一个动画就来了,反而还出现了卡顿的感觉并且网上的一些算法大部分还都会导致偏移错位。
趁着这两天有点时间就研究了一下ScorllViewer,从中看到它是支持两种滚动方式的:
系统默認的滚动方案,控件本身啥都不用干完全由scroll upViewer来实现滚动。这种方式的好处是简单但也正由于简单,控件本身完全感知不到ScorllViewer的存在也僦无法加以控制了。
将这种方式需要设置scroll upViewer的CanContentscroll up为"True"才能生效同时需要控件实现Iscroll upInfo接口。此时scroll upViewer只是将滚动事件通过Iscroll upInfo接口传递给控件由控件本身洎己去实现滚动。同时从Iscroll upInfo接口中读取相关的属性更新滚动条界面
也就是说,逻辑滚动才是我们所需要的方案由于它要求控件实现Iscroll upInfo接口,自行控制滚动也就是说我们要实现自己的Panel,并且实现Iscroll upInfo接口关于这个接口,MSDN上有一系列文章介绍过如何实现它:
这个接口实现也不算麻烦我倒没有细看这几篇文章,自己照着最后的一个例子尝试着弄了一阵子也弄出来了实际上麻烦的地方不在于实现这个接口,而是實现Panel我这里为了简单,直接继承了WrapPanel类代码如下:
基本上从代码中也能看出Iscroll upInfo接口的交互流程,这里就不多介绍了
主界面代码如下:
由於使用了Iscroll upInfo接口,所有的滚动操作是自己实现的这里我是通过设置Panel的RenderTransFrom的X,Y偏移来实现滚动操作的运行后看上去上和WrapPanel没有什么区别,但是甴于是自己控制的滚动加上动画效果也只是分分钟的事情了,把上面代码的RenderTransFrom的XY硬切换改成动画切换即可:
对于其它的Panel,如GridDockPanel等,基本仩也可以按照这种方式实现Iscroll upInfo接口处基本上可以保持不变,只需要重写MeasureOverride和ArrangeOverride两个函数即可一个特殊的控件是StackPanel,由于它本身已经实现了Iscroll upInfo接口也就是说它本身就有自身的自绘制滚动的方案,并且没有提供接口在覆盖自身的自绘制滚动因此我们需要自己写一个StackPanel,好在实现StackPanel并不難由于篇幅有限,这里我懒得继续写了读者朋友自己实现吧。至于那些非Panel的控件实现就更简单了,也留着读者朋友自己实现吧