既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞定,让PropertyGrid显示Control的所有属性。可是这里显示的属性名是英文的。对于我们开发人员来说这无可厚非,我们也乐于接受。并且让PropertyGrid显示中文属性名,这对于我们开发人员的使用来说显得多此一举。可是,对于我这种类型的一个应用工具,英文属性名对于很多客户来说可能就很难懂了。所以应该让PrpertyGrid能够显示中文属性名。
如图:
另外,对于这样的一个系统。并不是控件的所有属性都是用户希望的,可能用户希望看到的仅仅是控件高度、控件宽度、控件文本。。等等的属性,但是如果直接将一个控件属性全部显示给用户的话,估计对用户造成的干扰和困惑是很大的。如何解决这个问题呢?其实用户控件开发的时候,如果我们不希望此属性在PropertyGrid中显示,我们可以设置这个控件的Attribute,如:
[Browsable(false)]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
public int Width
{
get { }
set { }
}
通过使用BrowsableAttribute就可以设置将此属性对PropertyGrid隐藏。
你可能要问到了,对于控件来说,其中的很多属性都是直接继承来的,我们并没有办法控制是否对PropertyGrid隐藏啊?呵呵,对啊,这就是我下面要说的解决方法(当然此方法显得不是很灵活,但是对于这种类型的系统的确相当有用)。
在我的解决方式中,我不直接这样PropertyGrid.SelectedObject = Control,而是把这个Control替换成一个专门为此类型的Control设计的类对象上。比如我对TextBox设计了一个TextBoxProperty,这样我们使用的是PropertyGrid.SelectedObject = TextBoxProperty的一个对象。
下面就是TextBoxProperty的代码:
-
publicclassTextBoxProperty:PropertyBase
- {
-
privateTextBox_Control;
-
publicTextBoxProperty()
- {
- }
-
publicTextBoxProperty(TextBoxcontrol)
- {
-
this._Control=control;
- }
-
[MyControlAttibute("文本","获取或者设置控件文本","")]
-
publicstringText
- {
-
get{returnthis._Control.Text;}
-
set
- {
-
this._Control.Text=value;
- }
- }
-
[MyControlAttibute("宽度","获取或者设置控件宽度","")]
-
publicintWidth
- {
-
get{returnthis._Control.Width;}
-
set
- {
-
this._Control.Width=(int)value;
- }
- }
-
[MyControlAttibute("高度","获取或者设置控件高度","")]
-
publicintHeight
- {
-
get{returnthis._Control.Height;}
-
set
- {
-
this._Control.Height=(int)value;
- }
- }
-
[MyControlAttibute("上边距","获取或者设置控件上边位置","")]
-
publicintTop
- {
-
get{returnthis._Control.Top;}
-
set
- {
-
this._Control.Top=value;
- }
- }
-
[MyControlAttibute("左边距","获取或者设置控件左边位置","")]
-
publicintLeft
- {
-
get{returnthis._Control.Left;}
-
set
- {
-
this._Control.Left=value;
- }
- }
-
[MyControlAttibute("背景色","获取或者设置控件背景颜色","")]
-
publicColorBackColor
- {
-
get{returnthis._Control.BackColor;}
-
set
- {
-
this._Control.BackColor=value;
- }
- }
-
[MyControlAttibute("前景色","获取或者设置控件的前景颜色","")]
-
publicColorForeColor
- {
-
get{returnthis._Control.ForeColor;}
-
set
- {
-
this._Control.ForeColor=value;
- }
- }
- }
你从代码里面已经看出了一些端倪了,在TextBoxProperty中每个要属性都增加了MyControlAttibute,具体Attribute的概念和使用方法您可以参考我的另一篇Blog文《C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)》。这里对Attribute做了详细的介绍(对初学者有效)。所以我就直接贴出MyControlAttibute的代码好了:
-
publicclassMyControlAttibute:Attribute
- {
-
privatestring_PropertyName;
-
privatestring_PropertyDescription;
-
privateobject_DefaultValue;
-
publicMyControlAttibute(stringName,stringDescription,objectDefalutValue)
- {
-
this._PropertyName=Name;
-
this._PropertyDescription=Description;
-
this._DefaultValue=DefalutValue;
- }
-
publicMyControlAttibute(stringName,stringDescription)
- {
-
this._PropertyName=Name;
-
this._PropertyDescription=Description;
-
this._DefaultValue="";
- }
-
publicMyControlAttibute(stringName)
- {
-
this._PropertyName=Name;
-
this._PropertyDescription="";
-
this._DefaultValue="";
- }
-
publicstringPropertyName
- {
-
get{returnthis._PropertyName;}
- }
-
publicstringPropertyDescription
- {
-
get{returnthis._PropertyDescription;}
- }
-
publicobjectDefaultValue
- {
-
get{returnthis._DefaultValue;}
- }
- }
通过上面的两段代码,你已经初步看出了在PropertyGrid中显示中文属性以及仅仅显示我们需要的属性的基本思路。下面就介绍的就是怎么让MyControlAttibute中定义了的中文属性名在PropertyGrid中显示出来。下面这段代码,我仅仅贡献了PropertyStub中这个函数的实现。所以不做过多解释了:
-
publicoverridestringDisplayName
- {
-
get
- {
-
if(info!=null)
- {
-
MyControlAttibuteuicontrolattibute=(MyControlAttibute)Attribute.GetCustomAttribute(info,typeof(MyControlAttibute));
-
if(uicontrolattibute!=null)
-
returnuicontrolattibute.PropertyName;
-
else
- {
-
returninfo.Name;
- }
- }
-
else
-
return"";
- }
- }
整个代码如下,里面包含两个类,你直接拷贝出来就可以使用了:
-
publicdelegatevoidPropertyChanged(objectValue);
-
-
-
-
publicclassPropertyBase:ICustomTypeDescriptor
- {
-
-
-
-
-
#regionICustomTypeDescriptor显式接口定义
- AttributeCollectionICustomTypeDescriptor.GetAttributes()
- {
-
returnTypeDescriptor.GetAttributes(this,true);
- }
-
stringICustomTypeDescriptor.GetClassName()
- {
-
returnTypeDescriptor.GetClassName(this,true);
- }
-
stringICustomTypeDescriptor.GetComponentName()
- {
-
returnTypeDescriptor.GetComponentName(this,true);
- }
- TypeConverterICustomTypeDescriptor.GetConverter()
- {
-
returnTypeDescriptor.GetConverter(this,true);
- }
- EventDescriptorICustomTypeDescriptor.GetDefaultEvent()
- {
-
returnTypeDescriptor.GetDefaultEvent(this,true);
- }
- PropertyDescriptorICustomTypeDescriptor.GetDefaultProperty()
- {
-
returnnull;
- }
-
objectICustomTypeDescriptor.GetEditor(TypeeditorBaseType)
- {
-
returnTypeDescriptor.GetEditor(this,editorBaseType,true);
- }
- EventDescriptorCollectionICustomTypeDescriptor.GetEvents()
- {
-
returnTypeDescriptor.GetEvents(this,true);
- }
- EventDescriptorCollectionICustomTypeDescriptor.GetEvents(Attribute[]attributes)
- {
-
returnTypeDescriptor.GetEvents(this,attributes,true);
- }
- PropertyDescriptorCollectionICustomTypeDescriptor.GetProperties()
- {
-
return((ICustomTypeDescriptor)this).GetProperties(newAttribute[0]);
- }
- PropertyDescriptorCollectionICustomTypeDescriptor.GetProperties(Attribute[]attributes)
- {
-
ArrayListprops=newArrayList();
-
TypethisType=this.GetType();
- PropertyInfo[]pis=thisType.GetProperties();
-
foreach(PropertyInfopinpis)
- {
-
if(p.DeclaringType==thisType||p.PropertyType.ToString()=="System.Drawing.Color")
- {
-
-
BrowsableAttributeBrowsable=(BrowsableAttribute)Attribute.GetCustomAttribute(p,typeof(BrowsableAttribute));
-
if(Browsable!=null)
- {
-
if(Browsable.Browsable==true||p.PropertyType.ToString()=="System.Drawing.Color")
- {
-
PropertyStubpsd=newPropertyStub(p,attributes);
- props.Add(psd);
- }
- }
-
else
- {
-
PropertyStubpsd=newPropertyStub(p,attributes);
- props.Add(psd);
- }
- }
- }
-
PropertyDescriptor[]propArray=(PropertyDescriptor[])props.ToArray(typeof(PropertyDescriptor));
-
returnnewPropertyDescriptorCollection(propArray);
- }
-
objectICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptorpd)
- {
-
returnthis;
-
}
-
#endregion
- }
-
-
-
-
#regionPropertyStub定义
-
publicclassPropertyStub:PropertyDescriptor
- {
- PropertyInfoinfo;
-
publicPropertyStub(PropertyInfopropertyInfo,Attribute[]attrs)
-
:base(propertyInfo.Name,attrs)
- {
-
this.info=propertyInfo;
- }
-
publicoverrideTypeComponentType
- {
-
get{returnthis.info.ReflectedType;}
- }
-
publicoverrideboolIsReadOnly
- {
-
get{returnthis.info.CanWrite==false;}
- }
-
publicoverrideTypePropertyType
- {
-
get{returnthis.info.PropertyType;}
- }
-
publicoverrideboolCanResetValue(objectcomponent)
- {
-
returnfalse;
- }
-
publicoverrideobjectGetValue(objectcomponent)
- {
-
-
try
- {
-
returnthis.info.GetValue(component,null);
- }
-
catch
- {
-
returnnull;
- }
- }
-
publicoverridevoidResetValue(objectcomponent)
- {
- }
-
publicoverridevoidSetValue(objectcomponent,objectvalue)
- {
-
-
this.info.SetValue(component,value,null);
- }
-
publicoverrideboolShouldSerializeValue(objectcomponent)
- {
-
returnfalse;
- }
-
-
publicoverridestringDisplayName
- {
-
get
- {
-
if(info!=null)
- {
-
MyControlAttibuteuicontrolattibute=(MyControlAttibute)Attribute.GetCustomAttribute(info,typeof(MyControlAttibute));
-
if(uicontrolattibute!=null)
-
returnuicontrolattibute.PropertyName;
-
else
- {
-
returninfo.Name;
- }
- }
-
else
-
return"";
- }
- }
-
}
-
#endregion
修改后的Form界面如下:
Form中由于我仅仅是演示了TextBox所以我就是直接将创建TextBoxProperty对象的代码放在了Control_Click中:
//我这里仅仅做TextBox的属性演示,如果是其它的控件的话,那么你需要设计不同的ControlProperty(比如TextBoxProperty,ComboBoxProperty)
if (sender is TextBox)
{
this.propertyGrid1.SelectedObject = new TextBoxProperty((TextBox)sender);
}
else
{
this.propertyGrid1.SelectedObject = null;
}
对于实际的需要来说应该是根据Control的类型,通过工厂模式来创建ControlProperty。
Form的整个代码如下,窗体如上图所示:
-
-
publicpartialclassForm1:Form
- {
-
privateMouseHook_MouseHook;
-
-
privateHashtable_HashUISizeKnob;
-
-
privateHashtable_HashUIMoveKnob;
-
publicForm1()
- {
- InitializeComponent();
-
this._MouseHook=newMouseHook(this);
-
this._HashUISizeKnob=newHashtable();
-
this._HashUIMoveKnob=newHashtable();
-
-
this.ControlAdded+=newControlEventHandler(Form1_ControlAdded);
- }
-
voidForm1_ControlAdded(objectsender,ControlEventArgse)
- {
-
if(!(e.ControlisUISizeDot))
- {
-
this._HashUISizeKnob.Add(e.Control,newUISizeKnob(e.Control));
-
this._HashUIMoveKnob.Add(e.Control,newUIMoveKnob(e.Control));
-
-
e.Control.Click+=newEventHandler(Control_Click);
- }
- }
-
voidControl_Click(objectsender,EventArgse)
- {
-
-
foreach(UISizeKnobknobinthis._HashUISizeKnob.Values)
- {
-
knob.ShowUISizeDots(false);
- }
-
-
-
try
- {
-
((UISizeKnob)this._HashUISizeKnob[sender]).ShowUISizeDots(true);
-
-
if(senderisTextBox)
- {
-
this.propertyGrid1.SelectedObject=newTextBoxProperty((TextBox)sender);
- }
-
else
- {
-
this.propertyGrid1.SelectedObject=null;
- }
- }
-
catch{}
- }
-
privatevoidcmdArrow_Click(objectsender,EventArgse)
- {
-
SettingService.Instance.SelectedToolBoxControl=null;
- }
-
privatevoidcmdLabel_Click(objectsender,EventArgse)
- {
-
SettingService.Instance.SelectedToolBoxControl=newLabel();
- }
-
privatevoidcmdTextBox_Click(objectsender,EventArgse)
- {
-
SettingService.Instance.SelectedToolBoxControl=newTextBox();
- }
-
privatevoidcmdComboBox_Click(objectsender,EventArgse)
- {
-
SettingService.Instance.SelectedToolBoxControl=newComboBox();
- }
-
privatevoidcmdGroupBox_Click(objectsender,EventArgse)
- {
-
SettingService.Instance.SelectedToolBoxControl=newGroupBox();
- }
- }
好了,让
PropertyGrid显示中文属性的思路和代码都给了,希望能够给你点启发和帮助。
相关文章:
C#基础系列:开发自己的窗体设计器(总纲)
C#基础系列:开发自己的窗体设计器(在容器上拖动鼠标增加控件)
C#基础系列:开发自己的窗体设计器(实现控件的选择)
C#基础系列:开发自己的窗体设计器(实现控件的拖动)
分享到:
相关推荐
在.NET框架中,`PropertyGrid`控件是一个强大的工具,用于在Windows Forms应用程序中显示和编辑对象的属性。它提供了一种用户友好的界面,使开发者可以轻松地创建具有属性浏览器功能的应用。在这个主题中,我们将...
在.NET框架中,C#是一种常用的编程语言,用于构建各种应用程序,...在`WinFormDesigner`这个压缩包中,可能包含的就是一个用于演示或实践这些概念的示例项目,通过学习和分析,可以深入理解C#窗体设计器的定制方法。
设计器通常会有一个宿主进程(Hosting Process),这个进程能够承载设计时环境,例如文件中的"Hosting"可能就是这样的一个进程,它负责加载并显示窗体设计器,同时提供设计时服务,如控件的添加、删除、布局调整等。...
在.NET框架中,C#提供了一种强大的工具,允许开发者创建自定义的设计器,用于构建图形化设计界面,这就是DesignSurface。DesignSurface是System.Drawing.Design命名空间中的一个关键类,它为开发人员提供了在代码...
它的主要优点在于简化了UI设计,开发者只需要提供一个对象实例,`PropertyGrid`就会自动地解析并显示其所有可读写的属性。 在C#中使用`PropertyGrid`,首先你需要在Windows Form上添加一个`PropertyGrid`控件,这...
综上所述,AE+C#实例开发教程不仅涵盖了基础的桌面GIS应用程序框架搭建过程,还包括了菜单功能、控件同步、状态栏信息显示、鹰眼功能、右键菜单、图层符号选择器以及属性数据表的查询显示等多个方面的知识点。...
在.NET框架中,`PropertyGrid`控件是一个强大的工具,用于显示和编辑对象的属性。这个控件在设计时提供了一个交互式的属性浏览器,通常用于配置对象或组件的设置。在给定的“DataPropertyGrid控件,实现通过数据生成...
- **属性数据表查询显示**:使用PropertyGrid控件显示和编辑地图对象的属性。 #### 8. 教程和资源 本教程由3SDN原创,提供了ArcGIS Engine和C#结合的实例开发教程,供GIS开发初学者使用。教程详细讲解了从框架建立...
2. **属性网格初始化**:在窗体加载事件中,将要显示的对象实例赋值给`PropertyGrid`的`SelectedObject`属性。这会自动加载该对象的所有公共属性。 3. **自定义属性编辑器**:有时,内置的编辑器无法满足需求,这时...
- 属性面板使用PropertyGrid控件替换原来的DataGridView控件,更适合作为属性查询和设置的界面。 - 地图面板放置MapControl,提供地图浏览功能。 - 制版面板放置PageLayoutControl,用于地图的布局设计。 3. **...
- **问题修正**: 将“属性”选项卡中的 DataGridView 替换为 PropertyGrid 控件。 #### 二、菜单的添加及其实现 **1. 添加菜单** - **MenuStrip**: 在设计视图中键入菜单名称,例如“文件”、“编辑”等。 - **子...
- **PropertyGrid**: 显示对象属性。 - **MapControl**: 主要的地图显示控件。 - **PageLayoutControl**: 布局控制,用于地图制图。 - **LicenseControl**: 用于授权验证。 按照以下步骤添加控件并设置属性: - 将...
- **修改窗体名称**:在解决方案资源管理器中将默认的“Form1.cs”文件重命名为“3sdnMap.cs”,并在设计视图中修改窗体的`Text`属性为“3sdnMap”。 **知识点3:控件添加与布局** - **添加MenuStrip**:从工具箱...
在.NET Framework 2.0环境下,使用C#语言开发Windows Forms(Winform)应用程序,可以实现一个简单的流程图设计工具,其功能类似于知名的Visio软件。这个项目的主要目标是允许用户通过拖放操作来创建和编辑流程图。...
- **PropertyGrid**:替换之前的DataGridView控件,在“属性”选项卡中拖拽PropertyGrid控件,并设置其“Dock”属性为“Fill”。 - **TabControl**:再次将TabControl控件拖拽到SplitContainer的右侧面板,并设置其...
- **属性网格(Property Grid)**:Visual Studio中的属性网格允许开发者实时调整控件属性,查看和修改控件的详细设置。 3. **事件驱动编程(Event-Driven Programming)** - **事件**:当用户与控件交互(如点击...
(注意:应更改为PropertyGrid控件) - **添加地图和布局控件**:拖入TabControl控件到Panel2,设置Dock属性为Fill。将两个选项卡的Name和Text分别设置为:(tabPageMap、地图),(tabPageLayout,制版)。选择...