C# UserControl自定义属性为灰色

C# UserControl自定义属性为灰色,c#,properties,custom-controls,C#,Properties,Custom Controls,我很确定这是一个愚蠢的问题,但我所有的尝试都失败了。 我有一个自定义控件,其中我希望有一个复杂的属性来公开许多属性。我之所以要这样做,是因为我在visual property manager中有一个可扩展的属性,所以我可以轻松设置子属性,因为在父属性中分组在一起。 这是我所做工作的模式: public partial class QViewer : UserControl { private Shortcuts toolsShortcuts = new Shortcuts();

我很确定这是一个愚蠢的问题,但我所有的尝试都失败了。
我有一个自定义控件,其中我希望有一个复杂的属性来公开许多属性。我之所以要这样做,是因为我在visual property manager中有一个可扩展的属性,所以我可以轻松设置子属性,因为在父属性中分组在一起。 这是我所做工作的模式:

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 { ... }
    }
}
}

当我在表单中插入自定义控件(使用同一解决方案中的另一个项目)并打开属性时,快捷方式和测试都是灰色的,不可展开,因此我无法在其中设置属性。
发生了什么?有没有比创建类或结构更好的方法对属性进行分组 谢谢大家

IIRC您需要编写一个函数来获取属性窗口以展开这些属性

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

[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; }
    }
}
您的财产目前可能如下所示:

请注意,“拼写检查选项”属性已灰显

您需要创建一个TypeConverter来转换对象类型,以便正确显示对象类型。NET框架提供了类来简化这一过程

例如:

public class SpellingOptionsConverter:ExpandableObjectConverter 
{
    //...
}
您需要按照以下步骤创建自定义类型转换器

实现可以将字符串转换为点的简单类型转换器

  • 定义从ExpandableObjectConverter(或TypeConverter)派生的类
  • 重写CanConvertFrom方法,该方法指定转换器可以从中转换的类型。此方法已重载
  • 重写实现转换的ConvertFrom方法。此方法已重载
  • 重写CanConvertTo方法,该方法指定转换器可以转换为的类型。转换为字符串类型时无需重写此方法。此方法已重载
  • 重写实现转换的ConvertTo方法。此方法已重载
  • 重写执行验证的IsValid方法。此方法已重载
  • 有关如何实现TypeConverter的更多信息,请查看以下MSDN页面:

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

    [TypeConverterAttribute(typeof(SpellingOptionsConverter)),
     DescriptionAttribute("Expand to see the spelling options for the application.")]
    public class SpellingOptions{ ... }
    
    一切都会好起来的:

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

    IIRC您需要编写一个命令来获取属性窗口以展开这些属性

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

    [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; }
        }
    }
    
    您的财产目前可能如下所示:

    请注意,“拼写检查选项”属性已灰显

    您需要创建一个TypeConverter来转换对象类型,以便正确显示对象类型。NET框架提供了类来简化这一过程

    例如:

    public class SpellingOptionsConverter:ExpandableObjectConverter 
    {
        //...
    }
    
    您需要按照以下步骤创建自定义类型转换器

    实现可以将字符串转换为点的简单类型转换器

  • 定义从ExpandableObjectConverter(或TypeConverter)派生的类
  • 重写CanConvertFrom方法,该方法指定转换器可以从中转换的类型。此方法已重载
  • 重写实现转换的ConvertFrom方法。此方法已重载
  • 重写CanConvertTo方法,该方法指定转换器可以转换为的类型。转换为字符串类型时无需重写此方法。此方法已重载
  • 重写实现转换的ConvertTo方法。此方法已重载
  • 重写执行验证的IsValid方法。此方法已重载
  • 有关如何实现TypeConverter的更多信息,请查看以下MSDN页面:

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

    [TypeConverterAttribute(typeof(SpellingOptionsConverter)),
     DescriptionAttribute("Expand to see the spelling options for the application.")]
    public class SpellingOptions{ ... }
    
    一切都会好起来的:

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


    我会接受你的回答,因为它严肃而详细(因为你照片中的宝宝很棒!我也是一个父亲……)。一个问题:假设我想创建一个快捷方式类:我是否需要重写ExpandableObjectConverter派生类中的某些特定属性,或者我可以在您告诉我的每个属性中调用base.prop()?不完全确定您的意思,但您必须实现ConvertFrom(…)方法将输入的值转换回快捷方式类的类型。查看我答案()中第二个链接“添加可扩展属性支持”部分下的第5点。非常感谢,非常感谢!!我必须学习(老实说,我认为实现复杂属性更容易),但你让我走上了正确的道路。再次感谢!!:)我照你说的做了,现在我可以看到、扩展和更改我想要的属性了,谢谢!但是好一个小问题:更改后的数据未保存(序列化)到property owner中;因此,如果我关闭表单编辑器并重新打开它,对属性所做的所有更改都将丢失:(看看本文的“使用类型转换器的自定义类型代码序列化”一节:我将接受你的回答,因为这是严肃而详细的(因为你照片中的宝宝很棒!我也是一个父亲……)。一个问题:假设我想创建一个快捷方式类:我是否需要重写ExpandableObjectConverter派生类中的某些特定属性,或者我可以在您告诉我的每个属性中调用base.prop()?不完全确定您的意思,但您必须实现ConvertFrom(…)方法将输入的值转换回快捷方式类的类型。查看我答案()中第二个链接“添加可扩展属性支持”部分下的第5点。非常感谢,非常感谢!!我必须学习(老实说,我认为实现复杂属性更容易)