现在的位置: 首页 > 综合 > 正文

CS 系统框架二

2013年04月21日 ⁄ 综合 ⁄ 共 3746字 ⁄ 字号 评论关闭

自己一直想有一个完全属于自己的编程小框架,之前使用的方式是将每一个窗体文件都编译为一个DLL文件,在新建窗体的时候首先新建一个类,然后在这个类
里面新建窗体,编译之后就是一个DLL文件,最后通过一个函数去读取这个DLL文件里面的信息,包括窗体名称,版本等,最后将设个窗体Show出来,Show出来的时候是使用的WeifenLuo.WinFormsUI.Docking。看上去貌似没什么问题,但是每次New一个窗体的时候就要New一个对应的类,那么有几百个窗体呢?那项目将会大的惊人,所以放弃了这种做法,经过一段时间的构思,大致的框架结构出来了,我比较了一下,功能完全相同的两个项目,用之前的方法和我现在的方法相比较,前者的大小是后者大小的6倍。
首先我需要使用DockContent来实现窗体的停靠,其次我需要使用XtraForm的样式风格(IrisSkin2.dll真的是不好用,样式单调不说,应用了样式之后连控件的属性都设置不了了),大家都知道是不能多继承的,所以自己写一个类FrmBase,大致如下:

开发文档

 1 using System;
 2 using System.ComponentModel;
 3 using System.Drawing;
 4 using System.Windows.Forms;
 5 using WeifenLuo.WinFormsUI.Docking;
 6 
 7 namespace Allen.FrmBase
 8 {
 9     public class DockContent : XtraForm, IDockContent
10     {
11         public DockContent();
12 
13         [DefaultValue(true)]
14         [Category("Category_Docking")]
15         [Description("DockContent_AllowEndUserDocking_Description")]
16         public bool AllowEndUserDocking { get; set; }
17         [Category("Category_Docking")]
18         [Description("DockContent_AutoHidePortion_Description")]
19         [DefaultValue(0.25)]
20         public double AutoHidePortion { get; set; }
21         [Description("DockContent_CloseButton_Description")]
22         [Category("Category_Docking")]
23         [DefaultValue(true)]
24         public bool CloseButton { get; set; }
25         [DefaultValue(true)]
26         [Description("DockContent_CloseButtonVisible_Description")]
27         [Category("Category_Docking")]
28         public bool CloseButtonVisible { get; set; }
29         [Description("DockContent_DockAreas_Description")]
30         [Category("Category_Docking")]
31         public DockAreas DockAreas { get; set; }
32         [Browsable(false)]
33         public DockContentHandler DockHandler { get; }
34         [Browsable(false)]
35         public DockPanel DockPanel { get; set; }
36         [Browsable(false)]
37         public DockState DockState { get; set; }
38         [Browsable(false)]
39         public DockPane FloatPane { get; set; }
40         [DefaultValue(false)]
41         [Category("Category_Docking")]
42         [Description("DockContent_HideOnClose_Description")]
43         public bool HideOnClose { get; set; }
44         [Browsable(false)]
45         public bool IsActivated { get; }
46         [Browsable(false)]
47         public bool IsFloat { get; set; }
48         [Browsable(false)]
49         public bool IsHidden { get; set; }
50         [Browsable(false)]
51         public DockPane Pane { get; set; }
52         [Browsable(false)]
53         public DockPane PanelPane { get; set; }
54         [Category("Category_Docking")]
55         [Description("DockContent_ShowHint_Description")]
56         public DockState ShowHint { get; set; }
57         [Category("Category_Docking")]
58         [Description("DockContent_TabPageContextMenu_Description")]
59         [DefaultValue("")]
60         public ContextMenu TabPageContextMenu { get; set; }
61         [DefaultValue("")]
62         [Category("Category_Docking")]
63         [Description("DockContent_TabPageContextMenuStrip_Description")]
64         public ContextMenuStrip TabPageContextMenuStrip { get; set; }
65         public string TabText { get; set; }
66         [Description("DockContent_ToolTipText_Description")]
67         [Localizable(true)]
68         [Category("Appearance")]
69         [DefaultValue("")]
70         public string ToolTipText { get; set; }
71         [Browsable(false)]
72         public DockState VisibleState { get; set; }
73 
74         [Description("Pane_DockStateChanged_Description")]
75         [Category("Category_PropertyChanged")]
76         public event EventHandler DockStateChanged;
77 
78         public void Activate();
79         public void DockTo(DockPanel panel, DockStyle dockStyle);
80         public void DockTo(DockPane paneTo, DockStyle dockStyle, int contentIndex);
81         public void FloatAt(Rectangle floatWindowBounds);
82         protected virtual string GetPersistString();
83         public void Hide();
84         public bool IsDockStateValid(DockState dockState);
85         protected virtual void OnDockStateChanged(EventArgs e);
86         public void Show();
87         public void Show(DockPanel dockPanel);
88         public void Show(DockPane pane, IDockContent beforeContent);
89         public void Show(DockPanel dockPanel, DockState dockState);
90         public void Show(DockPanel dockPanel, Rectangle floatWindowBounds);
91         public void Show(DockPane previousPane, DockAlignment alignment, double proportion);
92     }
93 }

 

然后在每一个窗体文件里面都继承这个基类:
 public partial class FrmMain : Allen.FrmBase.DockContent
关键代码如下图所示:

 

以后如果做一些小型项目的话直接套用这个框架即可,只需要往里面增加窗体即可,在数据库里面保存一下对应的路径,前台便可以使用了,所有的数据操作都是用存储过程,如果数据有 异常只需要修改存储过程,不需要对客户端的程序进行修改再发布,维护起来方便很多。

 

抱歉!评论已关闭.