运行版本(纯借地儿发布)
附件: Puzzle_Quest_Launcher.rar (3033986 字节)
说明:
绿色,但是推荐解包到PQ的安装目录,不然会触发首启动配置。
需要.net 3.5 CLR~ Linq的原因~.net 2.0 跑不起来~
本来搞了一个 Publish的版本~但是 VS2008 乱七八糟的给我又是签名又是安全认证又是CodeFusion的~最后还弄出一个巨大无比的安装包来,于是~嗯~决定就这样原版发布~
[B]Source Code:
附件: PuzzleQuestLauncher.rar (231424 字节)
VS 2008 + C#+ .net 3.5
[B]说明:
PQLauncher中尝试了一种偶某日脑袋被门板挤了以后捣腾出来的 UI Layout Pattern~
仿照了在CSS流行以前的HTML页面用表格的布局方式(主要偶玩不转CSS,不然估计就是个Xml 控制布局的什么皮肤引擎之类的东东了):
Form上的分为很多个Panel,在Panel不工作的时候,会自动隐藏,其下方的Panel会自动收缩上来,Form本身也会跟着Panel的多少撑开或收缩。
Panel还支持模式对话框,当对话框显示的时候,非对话框有关的Panel会自动变灰
实现:
Form 底层是一个 Fill Dock 的 Table Layout Panel,把 Form 分割成了很多行。
每行里有个Dock的 Panel,有普通的 Panel,也有 Central Layout Panel,(这个东东是偶高出来的,用了一个偶自己的Layout Engine)
Form、Table layout Panel 的 Row 都打开了Autosize,Mode 是 Grow&Shrink~目的在于保证不要的地方可以自动收缩隐藏起来。
关于Centrall Layout Panel:
作用: 自动把Panel内的控件居中。
说明: 本来可以手动干这事,不过偶说过偶素懒人,所以就弄个这玩意儿来了[/B]
关于Dialog模式
Form上的Panel的管理是通过UIPanel类和PanelManager类完成的。
每个Panel控件与UIPanel类实例一一对应,UIPanel在PanelManager处注册。
UIPanel有子类DialogUIPanel,表示对话框的按钮所在的Panel。
其可以关联其他的UIPanel作为对话框的一部分
DialogUIPanel具有方法ShowDialog,用于显示对话框。当对话框显示时,将自动把除自己和自己所关联的Panel意外的所有Panel变灰。直至用户点击了Ok,或者Canel按钮~
PanelManager具有一个WaitDialogResult的方法,可以阻塞线程,直至当前对话框结束,并返回结果。
存在的问题和改进
由于是一个实验性的产品,偶又很懒,所以采用了这种灵异无比的控件和管理代码分离的方式实现(不然偶还得重写一大堆的Panel控件,很麻烦的说)。
这种实现方式很方便,在设计界面时Panel上的控件布局很容易(前提是在VS的IDE里,通过控件布局对齐线,可以很方便的对其各控件)
但是由于所有的控件都在一个Form里面,EventHandler一多就会让代码会显得非常凌乱(虽然我层层叠叠的不知道用了多少#region来把代码分块,但是看起来还是很不爽!),而且不同功能的Panel之间的代码完全没有隔离度破坏了不符合 高内聚,低耦合原则。
另外一个问题就是Dialog模式没有栈,因此在一个Dialog现实出来的时候,不可能再弹出一个新的Dialog(事实上我有这样的需求,在编辑Schema的时候,我就希望能再弹出一个MessageBox来,但是~目前的架构下~不可能)~
第三个问题,也是最麻烦的问题,Form控件要求Form的Height不能超过当前Screen的纵向分辨率N个Pixel。因此Form不能无穷大~当Panel太多的时候,麻烦就来了(事实上,我已经遇到了这个问题,只是没有对我的工作造成太大影响而已)。
解决问题的关键在于把每个Panel都重新弄一个控件(就像App里的每个Form都是System.Windows.Forms.Form的一个子类一样)。
然后建立一个容器Form,用Flow Layout Panel 替代 Table Layout Panel~然后动态加载各个panel到Form,这样灵活性才能达到最高,隔离度也能达到最高。
在PanelManager中加入Panel的Enable状态的栈(其实我的代码里有类似的尝试,就是关于SchemaList中关于操作CurrentSchema的。当然这里没有自定义一个栈,而是隐性的利用了方法调用本身的调用栈)。每次ShowDialog时把当前Panel的状态压栈,然后显示新Panel,之后再出栈(和调用函数时,保存现场的方式是一样的,因此我之前才可能利用调用栈去保存CurrentSchema的状态)。
That's all
Any qustion then Q me,MSN me, Fetion me, GTalk me, Mail me, Call me, Space me, and most important KICK ME!
THX.