• 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框架
  • 相关阅读:
    Eclipse for j2ee 无法调式问题
    Windows Redis安装,Java操作Redis
    Java Junit单元测试
    Spring 学习总结 使用静态工厂创建Bean
    JQuery AJAX 解析获得的JSON数据
    Spring中的ApplicationContext事件机制
    Android 扫一扫----ZXing 的使用
    Window环境下 Git 下载Android源码
    JAVA单向/双向链表的实现
    Activity和Service是否是在同一个进程中运行。
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2494929.html
Copyright © 2020-2023  润新知