机房重构--UI设计与单例思考

          机房合作版,选择了UI层的设计,尽管对界面上控件的搭配缺乏必要经验,但本次经历却也让自己收获良多,主要有解决了子窗体与父窗体嵌套的问题;出现了添加背景图片屏闪问题;单例模式的应用场景问题思考。

【子窗体与父窗体】

         本来以为子窗体与父窗体的实现有多困难,从网上查阅资料,只要把窗体的isMdiContainer属性改成true就编程父窗体,子窗体的实现代码就可以写成:

        Dim frmQueryMoenyChild As New frmQueryMoney  '实例化子窗体
        frmQueryMoenyChild.MdiParent = Me   ’确认父窗体
        frmQueryMoenyChild.Show()

        这样就实现子窗体与父窗体的嵌套,但有一个问题任然存在,如何让子窗体在放大缩小的时候控件也跟着成正常比例放大缩小呢?网上找了一些方法,但都是存在缺陷的。

方法一:更改anchor和dock属性

                                                    

        anchor既是锚点的意思,如图,每一个控件默认情况下与窗体保持上边缘和左边缘持固定举例,因此,无论窗体的如何变化,控件的位置和大小是不会随着改变的。如果将上下左右四个方向的都让控件与窗体保持相对距离时,就可以实现控件随着窗体的变化而变化,但窗体长宽比例变得不协调,控件同样也会变得不协调,而且还会出现控件叠加的情况。

        dock属性直接就将控件锁定到窗体的某一个边上或者中间部位,尽管窗体控件可以随窗体变化,但绝对是不美观的。

方法二:代码实现

        用代码跟anchor的属性相似,无非是根据窗体的四个边缘位置以及长宽锁定控件的位置,这样anchor属性所带来的弊端同样也是无法得到解决的,而且窗体中每一个控件都用代码来实现的话,无非让工程量变得很大。

方法三:使用容器控件,panel、flowlayoutPanel、tablelayoutPanel

        容器也是有anchor和dock属性的,而且容器也可以嵌套使用,这样使容器跟随窗体的变化来变化,而控件根据容器的改变来改变,相比之下可以减少控件增减的幅度。

【模板窗体的使用】

       记得在模板方法模式中我们使用过模板窗体,因为窗体的相似度很高,制作一个模板窗体,其他窗体继承即可。

       记得在牛腩中看到过,把所有用到的类、css、以及窗体文件为省去重复写注释的工作,都把他们做成了模板,基于这种思想,我们为什么不能为所有的窗体再设置一个模板呢?

            

        在这个模板里面我们固定好窗体的大小和背景图片,在设置其他窗体的时候就不用一个一个为他们添加背景和设置大小了。在组合查询部分同样也可以实现二次继承。

        但这里有一个小问题,在为窗体添加上背景图片以后,每次窗体加载都会出现屏闪现象,而且图片越大,闪动的效果越是明显。究其原因,图片过大,窗体先行加载,然后是背景和控件。由于背景占用内存过大,导致加载时间差增大。解决方法有线程的应用和缓存的使用,这些还是先缓缓等学到时候再来解决

【单例的使用思考】

        单例实现很简单:

    Private Shared singleModel As Form   ‘定义的自变量可以是具体的窗体
    Public Sub New()
        ' 此调用是设计器所必需的。
        InitializeComponent()
        ' 在 InitializeComponent() 调用之后添加任何初始化。
    End Sub
    Public Shared Function getInstance(ByVal frm As Form)
        If singleModel Is Nothing OrElse singleModel.IsDisposed Then  ’实例化条件
            singleModel = frm
            singleModel.MdiParent = frmMain1
        End If
        Return singleModel
    End Function
‘调用代码
     frmRecharge.getInstance(frmRecharge).Show()
         它可以有两种应用,一种是保证每一个子窗体都只出现一次,但各个窗体之间不受任何影响,也就是可以打开多个子窗体,但每一个只允许打开一次,这是就需要将上面的代码在每一个窗体上写一遍。

         另一种就是只允许一个子窗体打开,把上面那段代码放到我的模板窗体里面就可以了,这就可以保证要想操作一个功能必须没有在没有其他功能窗口的情况下实现。

         具体使用哪一种模式就得看用户需求了,观察我们平时使用的软件是倾向于第二种的,而我们使用的最大的系统软件--Windows操作系统是准许多窗口的。

【总结】

        机房合作版最重要的是锻炼我们设计模式的使用,而我却总是纠结于需求的分析,这也让我从中发现了很多问题,不管怎样对自己的学习都是一种检验和激励。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值