本文系原创,转载请注明出处:
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方法中,做了一个从右向左消失的操作,重点来了,大家看我好像有一个背景色的操作,之所以加这个是因为要让切换效果看着更明显一些,否则背景色都是黑色,动画效果是很不明显的。
以上就完成了我对之前小框架的改进功能,设计的比较简单,所以大家有什么好的建议,欢迎留言,多多指教!
最后,我想跟大家分享一下我创建的公众号,在里面会发一些技术文章以及博客的更新推送,欢迎大家关注,再次感谢大家的支持!
扫描二维码,关注我的微信公众号