暑期的时候用MCI封装了一个播放音乐的类,最近学习了GDI+,想着将这个类做成一个自定义的控件,那么在做的过程中有一个属性,如下:
public string FileName { get { return fileName; } set { fileName = value; } } private string fileName;
编译之后,将它加到窗体上后,调到该控件的属性编辑框,可以看到,在杂项中有这个属性,我们可以在后面的框框中输入文件名,可是这个有点不人性化。我想能不能做成我一点某处就弹出一个文件选择框,通过谷歌上搜索了一下,查到了一个设计时特性——System.ComponentModel.Editor,实际上它就是定义好的一个类,其中一个构造函数如下:
// // 摘要: // 用类型和基类型初始化 System.ComponentModel.EditorAttribute 类的新实例。 // // 参数: // type: // 一个表示编辑器类型的 System.Type。 // // baseType: // 用作编辑器查找键的基类或接口的 System.Type。此类必须是 System.Drawing.Design.UITypeEditor 或是从它派生的。 public EditorAttribute(Type type, Type baseType);
第一个参数是想要的编辑器的类型,第二个一该编辑器的基类类型,基类一般为UITypeEditor。
于是,我首先添加引用
双击该引用,打开对象浏览器,在里面发现了一个已经定义好的类,原来别人早就提供了(想想也是,连我这个渣渣都有如此需求),这下就可以不用自己去实现了,直接拿来用吧!
[System.ComponentModel.Editor(typeof(FileNameEditor), typeof(UITypeEditor))] public string FileName { get { return fileName; } set { fileName = value; } } private string fileName;
这段代码只是在上面的基础上加了一个Editor特性,再来看效果:多了一个按钮,当点击按钮会弹出:
这不就是我想要的吗,总算弹出来了。
可是人心总是不满的,我立马又有了新的欲望——文件过滤。因为这个选择框选择所有文件,所以我想能否过滤一下。如果是使用OpenFileDialog,那就so easy,只需要设置Filter属性就可以了,但是关键现在不是啊。正当我一筹莫展百感交集的时候我发现这个弹出的框和OpenFileDialog长得不仅形似,而且神似,于是我猜想他们两者必然存在关系。然后我就去查FileNameEditor类的相关方法,希望能找到一些蛛丝马迹,皇天不负有心人,总算让我看到了曙光
protected virtual void InitializeDialog(System.Windows.Forms.OpenFileDialog openFileDialog)
哈哈,原来它有一个函数的参数就是OpenFileDialog,而且这个函数还是虚函数,我只需要继承FileNameEditor类,然后重写这个方法,那要的效果还不任我发挥啊!
新增一个类AudioFileNameEditor,继承FileNameEditor:
public class AudioFileNameEditor : FileNameEditor { protected override void InitializeDialog(System.Windows.Forms.OpenFileDialog openFileDialog) { base.InitializeDialog(openFileDialog); openFileDialog.Filter = "Audio文件|*.mp3"; } }
修改属性代码:
[System.ComponentModel.Editor(typeof(AudioFileNameEditor), typeof(UITypeEditor))] public string FileName { get { return fileName; } set { fileName = value; } } private string fileName;
然后再看效果:
到现在为止,基本上实现了想要的功能。