这篇讲讲开发过程中一些重要问题解决。
1.支持ISupportIncrementalLoading,实现HasMoreItems属性和LoadMoreItemsAsync方法
因为我们上篇里面讲过,需要把源数据分成一个一个的Group作为GirdView的源,
所以LoadMoreItemsAsync方法里面我做了以下的实现:
应该还是比较清楚的,当源数据里面的个数超过了RowItemsCount的时候,我们才插入Item。
也就是说。当满15个Item的时候我们才插入第1个Row Item,当满30个Item的时候我们插入第2个Row Item......
可能有人会说,如果源数据不是15个整数,那怎么办呢??嗯,我也遇到了这个问题,当然,HasMoreItems属性也需要作相应的实现
当HasMoreItems为false的时候,就是说这个源不会有更多的数据了,所以这时候我们应该把剩余的Item都加入到下一个Row Item里面去。
2.当Window size 改变的时候,实现不同的可变大小结构。
public class ResizeableItems : List<ResizeableItem>
每一种结构,我用一个ResizeableItem来表示。
比如window 最小的时候这种结构。
设置GirdView里面的每个Item的宽高比2:1,设置ResizeableItem的最小和最大值,这个意思就是当window 到达MIn和Max的这个区间的时候就使用这个结构。
然后也设置出其它的结构样式。(PS:我这里还没找到Get 最小window 宽度的办法,好像只能设置,如果有办法的朋友请留言一下)

View Code
这样我们就设置好了,到达多少size的时候使用什么结构模板了。。
最后我们只需要在控件的MeasureOverrid中去设置,GridView的Item的样式就好了.
3.ListViewItem默认模板的修改
在使用这个的时候因为其实是个ListView,所以当你点击到GridView外面的时候就点击到了ListLViewItem上面,会有些你不想要的效果,比如PointerDown。
第一次用VS拿到ListViewItem的模板的时候发现没地方可能修改这个动画呢???
再查了下MSDN,发现原来,ListViewItem是有2套模板的,
这个模板跟我从VS里面拿到的是一样的。
总结:
虽然说这个控件已经满足了Boss的需求,但是我还是觉得有一些需要改进的。
1.UI Virtualized
如果说GridView里面的Item个数被用户设置的很多,这个必定是很占用内存的。
实际Debug,也发现,Live Visual Tree里面有3个ListViewItem.
感觉内存中不需要这么多个ListViewItem 来循环回收利用,我的猜想是微软做了上下各一个Item的缓存来提高Scrolling的流畅。
但对于这个控件来说,内存里面的UI Item 会有3*15个,因为我们知道VariableSizedWrapGrid是不支持UI虚拟化的。
2.没有对Insert,Delete进行处理。
这个控件还有一个限制,就是源是一个固定个数或者是ISupportIncrementalLoading,如果在过程中add,insert,delete的话,暂时没有进行处理。
只对Reset这种情况进行了处理。
希望有好想法的童鞋能留言,大家讨论共同进步。。
为了部落!