CS 系统框架二
自己一直想有一个完全属于自己的编程小框架,之前使用的方式是将每一个窗体文件都编译为一个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
关键代码如下图所示:
以后如果做一些小型项目的话直接套用这个框架即可,只需要往里面增加窗体即可,在数据库里面保存一下对应的路径,前台便可以使用了,所有的数据操作都是用存储过程,如果数据有 异常只需要修改存储过程,不需要对客户端的程序进行修改再发布,维护起来方便很多。
分类: C# , WinForm
标签: WinForm , 框架
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息