自己一直想有一个完全属于自己的编程小框架,之前使用的方式是将每一个窗体文件都编译为一个DLL文件,在新建窗体的时候首先新建一个类,然后在这个类
里面新建窗体,编译之后就是一个DLL文件,最后通过一个函数去读取这个DLL文件里面的信息,包括窗体名称,版本等,最后将设个窗体Show出来,Show出来的时候是使用的WeifenLuo.WinFormsUI.Docking。看上去貌似没什么问题,但是每次New一个窗体的时候就要New一个对应的类,那么有几百个窗体呢?那项目将会大的惊人,所以果断弃之,经过一段时间的构思,大致的框架结构出来了,我比较了一下,功能完全相同的两个项目,用之前的方法和我现在的方法相比较,前者的大小是后者大小的13倍。
首先我需要使用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
关键代码如下图所示:
以后如果做一些小型项目的话直接套用这个框架即可,只需要往里面增加窗体即可,在数据库里面保存一下对应的路径,前台便可以使用了,所有的数据操作都是用存储过程,如果数据有 异常只需要修改存储过程,不需要对客户端的程序进行修改再发布,维护起来方便很多。