很多时候,我们希望 Winform 具有 WPF 一样的特效,并且最好能根据项目要求自主添加特效。
我已经设计了一个小的开源库 MyAE,任何人可以自定义的下载和使用它,我会提供标准的代码编写方式和一些Demo特效演示。通过使用 MyAE,你可以减少大量的事件代码。这篇文章包含了 以下内容:
1) 特效使用示范
2) MyAE开源项目的结构和使用方法
3) 如何增删自己的特效
特效使用示范
例如,当你希望一个无边框的Winform窗体可以被自由拖动的时候,你只需要引入 MyAE.dll 后这么做:
MyAE.Form.SetWindowMove(this);
MyAE.Label.SetTimeLabel(label1);
完全不用自己再用个 timer 之类的控件或者再写一个线程来不停的给 Lable 赋值了!
我们可以有更深入的做法,比如要给一个控件设置圆角,在 Winform 里并没有直接提供这个办法,如何做呢?仅仅需要:
MyAE.Form.SetWindowRegion(this, 35);
通过这种做法,你可以把代码中为了交互体验而写的一堆冗杂事件代码全部简化成短短的 1 行 或者更多行代码。如果你无法理解这么做的意义,我们看下传统的做法,例如,要写一个窗体移动的事件,很多人会这么写:【顺手从某度找了段代码】
bool mov = false;//初始化
int xpos;
int ypos;
//在窗体的MouseDown事件中添加一下代码:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
mov = true;
xpos = MousePosition.X;//鼠标的x坐标为当前窗体左上角x坐标
ypos = MousePosition.Y;//鼠标的y坐标为当前窗体左上角y坐标
}
//在窗体的MouseMove事件中添加一下代码:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (mov)
{
this.Left += MousePosition.X - xpos;//根据鼠标x坐标确定窗体的左边坐标x
this.Top += MousePosition.Y - ypos;//根据鼠标的y坐标窗体的顶部,即Y坐标
xpos = MousePosition.X;
ypos = MousePosition.Y;
}
}
//在窗体的MouseUp和MouseLeave事件中添加一下代码:
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
mov = false;//停止移动
}
private void Form1_MouseLeave(object sender, EventArgs e)
{
xpos = 0; //设置初始状态
ypos = 0;
mov = false;
}
恕我直言,在代码里插入这么多行代码真的是丑爆了。
MyAE开源项目结构和使用方法
让我们再看下MyAE的项目结构,目前大概是这样的:
Control 的类包含了控件公用的特效方法,其他类则包含了对应控件特有的方法。这些类都在命名空间(Namespace)MyAE 下,这个项目会生成一个叫 MyAE.dll 的文件。你在其他项目里通过添加引用
就可以马上开始有趣的特效之旅了!使用方法如下:
MyAE.类名称.静态方法(参数)
如何增删自己的特效
我们先看看MyAE是如何实现一个关闭界面的效果的,以下的代码实现了设置一个按钮为某个窗体的关闭按钮:
using System;
namespace MyAE
{
public class Button
{
/// <summary>
/// 设置A按钮为B窗体的关闭按钮,可外部调用
/// </summary>
/// <param name="fm">要被关闭的窗体</param>
/// <param name="bt">作为关闭按钮的按钮</param>
public static void SetCloseBt(System.Windows.Forms.Form fm , System.Windows.Forms.Button bt)
{
bt.Click += new EventHandler((s,e)=>Bt_Click(s,e,fm));
}
//私有实现设置窗体关闭按钮
private static void Bt_Click(object sender, EventArgs e, System.Windows.Forms.Form fm)
{
fm.Close();
}
}
}
其中
bt.Click += new EventHandler((s,e)=>Bt_Click(s,e,fm));
把按钮的点击事件通过匿名函数传递参数到 Bt_Click 中,使原本的 sender(s)和event(e)两个参数多了一个新成员 form(fm)。
当看懂到这里,我们应该就理解了 MyAE 的实现过程,无非是一个匿名转化的过程。即使一知半解,任何人也可以依样画葫芦的写出特效库。
我们如何调用呢?正如前面所提到的,在一个Winform 的窗体代码 Load 事件里,写下:
MyAE.Button.SetCloseBt(this,bt1)
祝君好运!
源代码我发布到我的个人网站的下载列表里:郑与天的个人网站,我同样也会选择个空闲时间放在 GitHub上和各位一同 push完善。
当然,有一定C#基础的完全可以新建一个类库工程,直接用我上面的代码创造个人的特效库了!