让 UserControl 的 Text 属性(Property) 在设计时(Form Designer中)可见

来源:互联网 发布:淘宝卖家怎样提前收款 编辑:程序博客网 时间:2024/04/20 09:17

今天在写一个自定义的控件时遇到一个问题。

这个自定义控件为了实现一个 特殊功能的 Button, 暂时命名为 ButtonEx

 

实现概要:

public class ButtonEx : System.Windows.Forms.UserControl
{

        private string m_strTxt = "";
        public override string Text
        {
            get
            {
                return this.m_strTxt;
            }
            set
            {
                if (value == null || value.Length < 1)
                {
                    value = this.Name.ToString();
                }
                this.m_strTxt = value;
            }
        }

}

 

但是这样,回到 Form Designer 中发现 ButtonEx的属性列表里并未出现  Text 属性。

将 override 换成 new 结果还是一样, 但是如果将属性名换为: Caption, 此时在属性列表中

却能看到,不得其解!

几次反复下来,注意到了一点: 当我在VS中输入public override 后,在弹出的补齐列表中并未发现

这个 Text 属性, 也就是说 VS 此时并没看到这个属性。

 

启动 Reflector, 定位到 UserControl 控件。查看代码一下代码发现这个 Text 属性以下面的方式 override了:

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never), Bindable(false)]
public override string Text { get; set; }

 

从以上override 时设置的 attributes 中的名字中不难看出为什么 Text 属性不能显示了。

所以,在刚才的UserControl 的实现代码里加上这些 attributes 并将相应的取值改过来:

 

[DefaultEvent("Click")] // 由于UserControl 类在设计时双击时默认的添加的事件为Load,

                                    // 而Button 的双击添加的事件该为Click, 在此修改过来.

public class ButtonEx : System.Windows.Forms.UserControl
{

        private string m_strTxt = "";


        [Browsable(true), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),  

        EditorBrowsable(EditorBrowsableState.Always), Bindable(true)]

        public override string Text
        {
            get
            {
                return this.m_strTxt;
            }
            set
            {
                if (value == null || value.Length < 1)
                {
                    value = this.Name.ToString();
                }
                this.m_strTxt = value;
            }
        }

}

 

修改编译后, 到 Form Designer 中查看,熟悉的Text属性出现了。