UserControl自定义属性为灰色

时间:2011-09-24 12:43:44

标签: c# properties custom-controls

我很确定这是一个愚蠢的问题,但我所有的尝试都失败了 我有一个自定义控件,我希望有一个复杂的属性暴露许多属性。我想这样做是因为我在可视属性管理器中有一个可扩展属性,因此我可以轻松设置子属性,因为它们在父属性中组合在一起。 这是我所做的模式:

public partial class QViewer : UserControl
{
    private Shortcuts toolsShortcuts = new Shortcuts();
    private TestProp testProp = new TestProp();

    public Shortcuts ToolsShortcuts { get { return toolsShortcuts; } }
    public TestProp Test { get { return testProp; } }
}


public struct TestProp
{
    public bool DoIt;
    public DateTime Date;
}

public class Shortcuts
{
    Keys toolArrow = Keys.None;
    public Keys Arrow
    {
        get { return toolArrow; }
        set { ... }
    }
}

}

当我在表单中插入自定义控件(使用同一解决方案中的其他项目)并打开属性时,快捷方式测试都是灰色的,不可展开,所以我不能在里面设置属性。
怎么了?有没有比创建类或结构更好的分组属性的方法? 谢谢大家!

1 个答案:

答案 0 :(得分:4)

IIRC您需要编写TypeConverter来获取属性窗口以扩展这些属性。

假设您对复杂属性使用以下类型:

[DescriptionAttribute("Expand to see the spelling options for the application.")]
public class SpellingOptions
{
    private bool spellCheckWhileTyping = true;
    private bool spellCheckCAPS = false;
    private bool suggestCorrections = true;

    [DefaultValueAttribute(true)]
    public bool SpellCheckWhileTyping 
    {
        get { return spellCheckWhileTyping; }
        set { spellCheckWhileTyping = value; }
    }

    [DefaultValueAttribute(false)]
    public bool SpellCheckCAPS 
    {
        get { return spellCheckCAPS; }
        set { spellCheckCAPS = value; }
    }

    [DefaultValueAttribute(true)]
    public bool SuggestCorrections 
    {
        get { return suggestCorrections; }
        set { suggestCorrections = value; }
    }
}

您的属性目前可能如下所示:

enter image description here

请注意,“拼写检查选项”属性显示为灰色。

您需要创建一个TypeConverter来转换对象类型,以便正确显示。 .NET框架提供ExpandableObjectConverter类以使其更容易。

例如:

public class SpellingOptionsConverter:ExpandableObjectConverter 
{
    //...
}

您需要按照以下步骤创建自定义TypeConverter。

实现一个简单的类型转换器,可以将字符串转换为Point

  1. 定义一个派生自ExpandableObjectConverter(或TypeConverter)的类。
  2. 覆盖CanConvertFrom方法,该方法指定转换器可以转换的类型。这个方法过载了。
  3. 覆盖实现转换的ConvertFrom方法。这个方法过载了。
  4. 覆盖CanConvertTo方法,该方法指定转换器可以转换为哪种类型。没有必要重写此方法以转换为字符串类型。这个方法过载了。
  5. 覆盖实现转换的ConvertTo方法。这个方法过载了。
  6. 覆盖执行验证的IsValid方法。这个方法过载了。
  7. 有关如何实现TypeConverter的更多信息,请查看以下MSDN页面:

    How to: Implement a Type Converter

    创建TypeConverter后,您可以将其应用于自定义类型。

    [TypeConverterAttribute(typeof(SpellingOptionsConverter)),
     DescriptionAttribute("Expand to see the spelling options for the application.")]
    public class SpellingOptions{ ... }
    

    一切都会好的:

    enter image description here

    我很快总结了MSDN中的一个elobarate示例。您可以在此处找到完整的演练:

    Getting the Most Out of the .NET Framework PropertyGrid Control