首页 > 代码库 > C#自定义设计器——文件名选择编辑器

C#自定义设计器——文件名选择编辑器



C#自定义设计器——文件名选择编辑器

       暑期的时候用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;

然后再看效果:

到现在为止,基本上实现了想要的功能。微笑吐舌头偷笑大笑得意再见



C#自定义设计器——文件名选择编辑器