C#动态设计时属性

时间:2015-04-16 17:32:00

标签: c# properties design-time

我想有一个控件,如果另一个属性的值设置为特定值,则允许显示属性。以下是我想要的简化示例:

public class CustomButton : Control 
{
    private ButtonType _bType = ButtonType.OnOff;
    private Int32 _minPress = 50;   // 50 mS

    public ButtonType Button_Type
    {
        get { return _bType; }
        set { _bType = value; }
    }

    public Int32 Minimum_Press_Time // Only for momentary buttons
    {
        get { return _minPress; }
        set { _minPress = value; }
    }

}
public enum ButtonType 
{
    Momentary,
    OnOff
}

在将CustomButton添加到Windows.Forms表单时,如果Button_Type更改为ButtonType.Momentary,则Minimum_Press_Time将仅显示在“属性”窗口中。

这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

是的,它可能会接近,但看起来有点奇怪。我以前在一些控件上做过这个。以下是您需要做的完整示例:

public partial class CustomButton : Control
{
    private ButtonType _buttonType = ButtonType.OnOff;
    private CustomButtonOptions _options = new OnOffButtonOptions();

    [RefreshProperties(System.ComponentModel.RefreshProperties.All)]
    public ButtonType ButtonType
    {
        get { return _buttonType; }
        set
        {
            switch (value)
            {
                case DynamicPropertiesTest.ButtonType.Momentary:
                    _options = new MomentaryButtonOptions();
                    break;
                default:
                    _options = new OnOffButtonOptions();
                    break;
            }
            _buttonType = value;
        }
    }

    [TypeConverter(typeof(ExpandableObjectConverter))]
    public CustomButtonOptions ButtonOptions
    {
        get { return _options; }
        set { _options = value; }
    }

    public CustomButton()
    {
        InitializeComponent();
    }
}

public enum ButtonType
{
    Momentary,
    OnOff
}

public abstract class CustomButtonOptions
{

}

public class MomentaryButtonOptions : CustomButtonOptions
{
    public int Minimum_Press_Time { get; set; }

    public override string ToString()
    {
        return Minimum_Press_Time.ToString();
    }
}

public class OnOffButtonOptions : CustomButtonOptions
{
    public override string ToString()
    {
        return "No Options";
    }
}

所以基本上发生的事情是你使用ExpandableObjectConverter将抽象类型转换为一组选项。然后,使用RefreshProperties属性告诉属性网格在此属性更改后需要刷新属性。

这是我发现尽可能接近你所要求的最简单方法。属性网格并不总是以正确的方式刷新,因此有时在没有可扩展属性的选项集旁边会有一个“+”符号。使用属性中的“ToString”使属性网格上的显示看起来很智能。