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://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息