C#框架编程初探的改进

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengbao315/article/details/82778213

本文系原创,转载请注明出处:

https://blog.csdn.net/chengbao315/article/details/82778213

上一篇文章我做了一个小框架的案例,反复思考之后觉得有些不妥的地方,所以做了一些改进,在本篇文章中进行更新,欢迎大家继续提出宝贵意见,帮助完善我的小框架,非常感谢。

这一次改进主要有两点:1.点击已经点击过的界面不需要重新加载数据,直接使用之前加载完的结果;2.界面之间的切换增加一些切换效果,让界面更友好。好了,大家来看下最终效果:

先来说下数据加载优化,之前的设计看过的朋友可能会知道,每次切换界面时,我都会重新new一个新对象,这样如果界面已经有过操作数据的话,就需要重新加载,比较浪费资源。这里我处理的方法是每次new完新对象不销毁,将对象加入字典,第二次显示时直接从字典中取出对象显示,看代码:

 1        /// <summary>
 2        /// 获取module实体
 3        /// </summary>
 4        /// <param name="moduleType"></param>
 5        /// <returns></returns>
 6        public object GetModule(ModuleType moduleType)
 7        {
 8            if (moduleType == ModuleType.Unknown) return null;
 9            var mainModuleType = this.mainModule.GetType();
10            // 获取module实体类型
11            var moduleTpye = mainModuleType.Assembly.GetType(mainModuleType.Namespace + "." + moduleType.ToString());         
12            if (SelectedModule != null)
13            {
14                if (!this.dicModule.ContainsValue(SelectedModule))
15                {
16                    this.dicModule.Add(this.oldModuleType, SelectedModule);
17                }
18            }
19            if (this.dicModule.ContainsKey(moduleType))
20            {
21                return this.dicModule[moduleType];
22            }
23            // 使用反射生成module实体
24            return Activator.CreateInstance(moduleTpye);
25        }

代码的实现比较简单,在之前的获取实体方法中,我加了两个判断,如果SelectedModule不为空,就将他加到字典中,同时返回实体时判断实体是否存在,如果存在就返回之前的实体,而不重新new一个,就这么简单。

为了验证我的设计是否可用,需要在自己的Module中添加一些可以录入数据的控件,这里我只放了一个简单文本框,看效果:

下一步就要实现界面的切换动画了。在网上搜索了一下,发现其实有很多动态库可以支持这种特效,效果都非常好,但是为了尽可能的少用第三方的设计,我这里使用了系统自带的方法,接着看代码:

 1    public class Animate
 2    {
 3        [DllImportAttribute("user32.dll")]
 4        public static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
 5
 6        public const Int32 AW_HOR_POSITIVE = 0x00000001;
 7        public const Int32 AW_HOR_NEGATIVE = 0x00000002;
 8        public const Int32 AW_VER_POSITIVE = 0x00000004;
 9        public const Int32 AW_VER_NEGATIVE = 0x00000008;
10        public const Int32 AW_CENTER = 0x00000010;
11        public const Int32 AW_HIDE = 0x00010000;
12        public const Int32 AW_ACTIVATE = 0x00020000;
13        public const Int32 AW_SLIDE = 0x00040000;
14        public const Int32 AW_BLEND = 0x00080000;
15    }

我创建一个动画类,在界面切换时调用AnimateWindow方法就可以实现切换效果,这里强调一下入参,hwnd是控件的句柄,dwTime是效果时间,单位是毫秒,dwFlags是使用什么效果,这里定义了几种常用的切换效果,具体使用方法大家可以百度一下,这里不是重点。

接下来看主窗体是怎么调用的切换方法的:

 1        private void viewModel_ModuleAdded(object sender, EventArgs e)
 2        {
 3            var moduleControl = sender as Control;
 4            moduleControl.Dock = DockStyle.Fill;
 5            moduleControl.Size = panel2.ClientSize;
 6            moduleControl.Parent = panel2;
 7            Animate.AnimateWindow(moduleControl.Handle, 300, Animate.AW_ACTIVATE + Animate.AW_HOR_NEGATIVE);
 8        }
 9        private void viewModel_ModuleRemoved(object sender, EventArgs e)
10        {
11            panel2.Controls[0].BackColor = Color.DimGray;
12            Animate.AnimateWindow(panel2.Controls[0].Handle, 100, Animate.AW_HIDE + Animate.AW_HOR_NEGATIVE);
13            panel2.Controls[0].BackColor = Color.Black;
14            panel2.Controls.Clear();
15        }

主窗体的添加Module处理方法中,增加了一个进入的渐变操作,同时移除Module方法中,做了一个从右向左消失的操作,重点来了,大家看我好像有一个背景色的操作,之所以加这个是因为要让切换效果看着更明显一些,否则背景色都是黑色,动画效果是很不明显的。

以上就完成了我对之前小框架的改进功能,设计的比较简单,所以大家有什么好的建议,欢迎留言,多多指教!

最后,我想跟大家分享一下我创建的公众号,在里面会发一些技术文章以及博客的更新推送,欢迎大家关注,再次感谢大家的支持! 

                                                                   

                                                                     扫描二维码,关注我的微信公众号

猜你喜欢

转载自blog.csdn.net/chengbao315/article/details/82778213