为什么在向自定义控件添加新属性时未显示属性?

时间:2014-11-12 18:12:14

标签: c# .net winforms

我有一个库类,我添加了一个新的用户控件并添加了一个代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CustomControl
{
    public partial class ExtendedTextBox : UserControl
    {
        [PropertyTab("Data")]
        [Browsable(true)]
        [Category("Extended Properties")]
        [Description("Set TextBox border Color")]

        public string Texts
        {
            get { return textBox.Text; }
            set { textBox.Text = value; }
        }

        private TextBox textBox;

        public ExtendedTextBox()
        {
            InitializeComponent();

            textBox = new TextBox();
            textBox.Multiline = true;
            textBox.BorderStyle = BorderStyle.None;
            this.Controls.Add(textBox);
        }

        private void ExtendedTextBox_Load(object sender, EventArgs e)
        {

        }

        private void ExtendedTextBox_Paint(object sender, PaintEventArgs e)
        {
            ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Red, ButtonBorderStyle.Solid);
        }

        private void ExtendedTextBox_Resize(object sender, EventArgs e)
        {
            textBox.Size = new Size(this.Width - 3, this.Height - 2);
            textBox.Location = new Point(2, 1);
        }
    }
}

当我将dll文件添加到另一个Windows窗体项目时,我将控件拖动到设计器,但在控件属性下的解决方案资源管理器中,我看不到数据而不是扩展属性而不是设置TextBox边框颜色。

我想添加一个属性,当你点击它时会给你一个子属性并点击它会打开颜色模式,这样你就可以改变/设置一个新颜色到paint事件。

现在在paint事件中它被设置为Red但我希望有一个属性,以便用户可以设置任何颜色。

3 个答案:

答案 0 :(得分:0)

存储textBox边框颜色的属性在哪里?我只看到public string Texts属性。您应该为textBox border添加新属性:

[PropertyTab("Data")]
[Browsable(true)]
[Category("Extended Properties")]
[Description("Set TextBox border Color")]
public Color BorderColor { get; set; }

答案 1 :(得分:0)

您在哪里定义继承Data的{​​{1}}类?如果您没有自己定义,那么您希望设计师使用哪个PropertyTab课程?

其他属性 - DataCategory - 对我来说很好。自定义属性显示在Description控件的“属性”选项卡中,在其自己的“扩展属性”类别中(当然,您必须按类别对属性进行分组,而不是按字母顺序分组),并使用正确的描述文本(在PropertyGrid)中选择属性时显示。

PropertyGrid属性必须指定有效的PropertyTab类。如果您没有使用PropertyTab类,那么很明显该属性无法显示在Data类的属性选项卡中。

答案 2 :(得分:0)

不太了解你的尝试。但是,在您的代码中需要进行一些更改之后,这对我很有用。

public partial class ExtendedTextBox : UserControl
{
    [PropertyTab("Data")]
    [Browsable(true)]
    [Category("Extended Properties")]
    [Description("Set TextBox border Color")]
    public Color BorderColor { get; set; }

    [PropertyTab("Data")]
    [Browsable(true)]
    [Category("Extended Properties")]
    [Description("Set TextBox Text")]
    public string Texts
    {
        get { return textBox.Text; }
        set { textBox.Text = value; }
    }

    private TextBox textBox;

    public ExtendedTextBox()
    {
        textBox = new TextBox();
        textBox.Multiline = true;
        textBox.BorderStyle = BorderStyle.None;
        this.Controls.Add(textBox);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, BorderColor, ButtonBorderStyle.Solid);
    }

    protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);
        textBox.Size = new Size(this.Width - 3, this.Height - 2);
        textBox.Location = new Point(2, 1);
    }
}

编辑:立即应用更改 你需要刷新控制BorderColor属性捕获设置的时刻,这是不可能的自动属性,但只有完整的属性。这样:

//private field needy in full property.
private Color _BorderColor = Color.Red;  //= Color.Red; for default color...

[PropertyTab("Data")]
[Browsable(true)]
[Category("Extended Properties")]
[Description("Set TextBox border Color")]
public Color BorderColor
{
    get {return _BorderColor ;}
    set
    {
        _BorderColor = value;
        Invalidate(); //refresh, trigger new paint.
    }
}