WEB开发网
开发学院软件开发C语言 C#开发WPF/Silverlight动画及游戏系列教程(Game T... 阅读

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十五)制作精美的可任意拖放对象的物品栏及装备栏

 2010-09-30 22:35:31 来源:WEB开发网   
核心提示: 其中Value值中的数据一一对应影响主角的21个基本属性,最后将这些赋予QXIcon,C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十五)制作精美的可任意拖放对象的物品栏及装备栏(3),再将所有的QXIcon绑定到物品栏的ObservableColl

其中Value值中的数据一一对应影响主角的21个基本属性,最后将这些赋予QXIcon,再将所有的QXIcon绑定到物品栏的ObservableCollection<QXIcon>中,到此就全部实现了物品栏对主角所持物品的显示:

嘿嘿,怎么样?这些物品与背景网格匹配得很好吧~而且物品栏里的所有物品都可以相互间拖放变换位置,很有意思呢。

完成了物品栏,下面我们用同样的方法来实现角色的装备栏。此时问题又来了,装备栏里的所有装备格的排放并非都有规律,一些在这,一些在那:

而不论ListBox套用何种模板,也只能实现内部子对象按相应的规律摆放,要实现装备任意位置的摆放,我们不妨以一个装备对应一个ListBoxDragDropTarget 和ListBox来实现。这样就可以很简单的布局出主角的9件装备栏了:

此时我们尝试一下打开物品栏,任意拖放一个物品到装备栏中,OK,成功了。但是反过来,从装备栏中将已装备的东西拖到物品栏中却报错了,而且这个错误无法调试,后来经过反复尝试,发现问题原来出在WrapPanel上,如果不使用WrapPanel,就算在两个StackPanel之间拖放都不会存在任何问题;而从一个ListBox中将对象拖到另一个WrapPanel中时,却会出现JS无法调试的错误;同样的,我还曾尝试使用一个PagedCollectionView来对WrapPanel进行分页,确实做到了,但是当将对象拖放到WrapPanel的第二页时,同样会报JS无法调试错误,基本肯定问题出来WrapPanel控件上,希望MS在未来的版本中能将这个实用的控件兼容性与功能完善好。没办法,都做到这个地步了,硬着头皮也得写完呀,看来只能自己去实现相应的事件功能模块了。还是从ListBoxDragDropTarget的所有事件的理解着手。ListBoxDragDropTarget在拖放方面的事件真不少:DragEnter、DragLeave、DragOver、Drop、GiveFeedback、ItemDragCompleted、ItemDragStarting、ItemDroppedOnSource、ItemDroppedOnTarget、QueryContinueDrag,其中又可以化分为拖(Drag)和放(Drop)两类,从字面意思上大家可以很容易理解,正常状态下,从一个ListBox(这里记做listBox1)往另外一个ListBox(记做listBox2)拖放控件,当鼠标在listBox1中的一个子控件上按住左键不放时,首先触发的是listBox1的ItemDragStarting事件,然后会卡那么一下(没去看具体源码,或许在执行遍历,就算在4核的电脑上也同样会卡一下,可见MS赶工的水平)完成抓取并触发listBox1的ItemDragCompleted事件,如果是在自身listBox1中放下,则触发listBox1的ItemDroppedOnSource事件,而如果在listBox2中放开,则先触发listBox2的Drop事件,再最后触发listBox1的ItemDroppedOnTarget事件。感觉上去还是比较混乱的,这个拖放做得真是。。。当然,在整个过程中还会触发另外剩下的那几个事件,字面上都很好理解,这里就不细说了。

上一页  1 2 3 4  下一页

Tags:开发 WPF Silverlight

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接