前言
- 最近比较忙,一段时间没写博文了。最近仿vs做了一个自定义界面的功能,使用到了PropertyGrid控件,让我的代码量减少了很多,就抽个晚上把PropertyGrid控件的使用技巧分享一下。
- PropertyGrid控件估计大家都很熟悉,但凡使用winform开发过界面的都认识,就是配置控件属性的控件,如下图:
用途
当然,以上只是vs软件的功能,我们如果想要实现类似vs的这个功能,其实官方已经帮我们封装好了,拖出来用就行了。只要给PropertyGrid控件的SelectedObject属性绑定对象,该对象的所有属性都会自动显示在PropertyGrid控件的网格中,进而可以配置。下面展示一下我的使用:
PropertyGrid属性介绍
- PropertyGrid的属性很多,我们需要使用的也很多。由于篇幅有限,我就挑几个重要的说一下,需要用到的同学还得自己去了解仔细:
- SelectedObject:所绑定的单个对象;
- HelpVisible:显示属性描述区域,对应特性Description的内容;
- SelectedObjects:绑定多个对象,展示他们同名属性。
PtopertyGrid事件介绍
- 同样,挑常用的几个:
- PropertyValueChanged:这个事件很重要,当我们修改PtopertyGrid网格里面的内容(当前绑定的对象的值)时,这个事件会触发,我们相应需要把一下逻辑写到这个事件的实现里面。
基础特性
-
当我们想给某属性添加某些修饰或者限制时,可以通过特性来完成。当然,PtopertyGrid控件也能根据该特性做些改变
-
BrowsableAttribute:在PtopertyGrid控件中显示属性,属性默认显示,当该特性设为false时不显示;
-
Category:在PtopertyGrid控件中分类,如上图的“关联信息”、“外观”等类型,可以把某些属性归类;
-
DisplayName:在PtopertyGrid控件中名字,如上图的“文字位置”、“文本”、“宽高”等信息;
-
Description:在PtopertyGrid控件中对选中属性的描述,如上图最底下的文字;
-
当然还可以自定义特性,有兴趣的同学可以深入了解一下文章来源:https://www.toymoban.com/news/detail-707150.html
高级特性(自定义下拉框)
- TypeConverter:类型转换,将任意类型转换成另一种类型,是它帮助我们实现自定义下拉框配置属性值,这个特性是本文章重点。
- 如上图,工程名称属性就使用了自定义下拉框,配置属性非常方便;
/// <summary>
/// 当前工程名称
/// </summary>
[Browsable(true), DisplayName("工程名称"), Category("关联信息"), Description("关联所选工程"),
TypeConverter(typeof(PojNameType))]
public string ProjName
- 如上代码,其中“TypeConverter(typeof(PojNameType))”中的PojNameType是我自定义的类型转换器,继承自StringConverter,当然也可以继承TypeConverter等。这里是使字符串对象与其他表示形式之间相互转换,所以使用StringConverter。
- 如果Converter是用于该属性的类型uint与用于显示的类型string之间的转换,Converter是用于该属性的类型uint与用于显示的类型string之间的转换;ConvertFrom是string转换成uint;
- 通过以下代码实现自定义下拉框:
/// <summary>
/// 输入链接所选工程名称
/// </summary>
public class PojNameType : StringConverter
{
List<string> allToolName = new List<string> { };
//重写,支持从标准模板中选中值作为返回值
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
//重写,提供转换器并
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
allToolName.Clear();
//遍历提取传进编辑界面的所有流程
if (context.Instance is LinkProjControlBase)
{
LinkProjControlBase linkProjControlBase = context.Instance as LinkProjControlBase;
foreach (var item in linkProjControlBase.ProjNameToIntptr)
{
allToolName.Add(item.Key);
}
}
return new StandardValuesCollection(allToolName); //编辑下拉框中的items
}
//重写,不支持编辑文本(true为不支持)
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
}
高级特性(自定义弹窗)
- Editor:编辑器,当我们想实现自定义弹窗的编辑器时,使用这个可以帮助我们,当然其不仅仅等实现弹窗,下拉框也可以实现;
- 如上图,自定义一个选择项目的弹窗,来配置属性。
/// <summary>
/// 链接的工具名称,选中相同的无法触发Set,即无法更新ToolIntptr
/// </summary>
[Browsable(true), Category("关联信息"), Description("关联的工具名称"), Editor(typeof(ToolNameItemsType), typeof(UITypeEditor))]
public string ToolName
- 以上代码是使用Editor的特性方法,其中ToolNameItemsType是自定义弹窗类型转换器,继承UITypeEditor
/// <summary>
/// 继承UITypeEditor类,弹窗形式选择
/// 链接工具名称—单工具
/// </summary>
public class ToolNameItemsType : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
List<string> allToolName = new List<string>();
if (context != null && context.Instance is LinkToolControlBase)
{
//类型转换
LinkToolControlBase toolControl = context.Instance as LinkToolControlBase;
allToolName = new List<string>(toolControl.toolNameAll.ToArray());
}
IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
//弹窗选择
FrmSelectTool f = new FrmSelectTool(allToolName);
edSvc.ShowDialog(f);
//赋值属性
value = f.SelectName;
}
return value;
}
}
结论
- PropertyGrid在软件开发中,能帮省略很多代码,用起来非常方便
- Converter用于处理输入值时的行为,常用于有效性验证、格式转换等,而Editor用于处理下拉或打开新窗口时的行为。它们可以在同一个属性上共存。
- 后面再写一篇关于自定义界面布局的文章剖析PropertyGrid的妙处
注:
转载本文需要标明出处!
谷子彭:1062484747@163.com文章来源地址https://www.toymoban.com/news/detail-707150.html
到了这里,关于C# 控件基础2——属性配置控件PropertyGrid使用详解,PropertyGrid自定义下拉框TypeConverter,PropertyGrid自定义弹窗UITypeEditor,特性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!