vs2008的用户自定义控件

近日里,由于框架改造的需要,需要将跳转菜单(GotoMenu)功能从原有的以Config配置文件的方式,修改为在Design Time环境下进行可视化配置的方式实现。于是做了一些准备,在Microsoft MSDN上翻阅了诸多资料,意外地,在 扩展设计时支持的外部资源 中找到了一些好东东,首先推荐一下。

言归正传,微软的工程师们当初在设计Visual Studio的设计时编辑器时,考虑到开发人员需要在运行时以及设计时绘制,调试相关的控件、组件。将VS界面设计器设计为一个“可扩展”的属性编辑器。

界面编辑器的自定义,最常用的是使用属性(Attribute,为了与属性,Property,区分开,下文中使用“特性”)进行界面浏览设计。其中,最常用的,便是BrowsableAttribute。默认情况下,用户自定义组件中的属性都是默认可见了,即默认BrowsableAttribute为true的情况。当不希望某个属性在属性编辑器中显示时,我们可以做如下设置:

private Person person = new Person();
//[Browsable(false)]
public Person Person
{
    get { return this.person; }
}

此时,在属性编辑器中,我们可以看到,Person属性是可见的。

image

 

//[Browsable(false)]

注释去除,此时,Person属性,将不会在属性编辑器中展现出来:

 image


回顾第一张图中显示的内容,我们可以发现,Person属性是不可编辑的,并且,在窗体Designer.cs窗体设计内容(本文中为Form1.Designer.cs)文件中,找不到关于Person属性的设置

 

image

 

这是为何呢?

在VS的属性编辑器的信息传递到.net程序(C#,VB)代码的时候,其相应的属性信息是需要进行序列化后,将属性内容持久化到本地代码中的。

Person属性是一个自定义类型的属性设置,因此,属性编辑器在序列化过程中,无法找到其相应的序列化设置,因此,在编辑设置该属性时,程序员需要指定序列化内容。添加如下代码:

private Person person = new Person();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Person Person
{
    get { return this.person; }
}

回到窗体设计代码中(Designer.cs)

image

当然,在自定义控件的过程中,如果涉及到序列(List)的设置,也同样是需要指定序列化内容的。

除了以上描述的两个属性外,Visuao Studio的扩展设计时支持内容中,还包括DevaultValueAttribute,CategoryAttribute等,具体的内容可到MSDN查阅。

你可能感兴趣的:(vs2008)