【问题标题】:C# PropertyGrid => How to change visible Properties at RuntimeC# PropertyGrid => 如何在运行时更改可见属性
【发布时间】:2011-09-09 09:32:21
【问题描述】:

我必须解决问题,

在地图编辑器中,您可以在对象上放置“关节”(FarseerPhysics),有 23 种类型的关节(在一个枚举中)。关节几乎都相同(每个关节类型只有 1-2 个新属性)。我想让用户使用 WinForm PropertyGrid 更改关节。 因此,如果用户更改属性“JointType”(枚举),PropertyGrid 需要隐藏旧属性并显示新属性,有没有办法实现呢? (所有关节的所有属性都保存在一个名为 JointItem 的类中,我只需要动态显示/隐藏其中一些)

【问题讨论】:

  • 我没有尝试任何东西,因为我不知道(我只是在网上找到了Browsable的属性)

标签: c#


【解决方案1】:

PropertyGrid 中没有简单的内置支持来根据另一个属性的值动态改变哪些属性是可见的。这并不意味着它不能完成,只是需要一些工作。

正如您已经发现的那样,控制属性是否可见的是BrowsableAttribute。所以基本上你需要动态改变这个属性,这样做的方法是为你的类创建你自己的TypeProviderTypeDescriptor,动态返回Browsable(false)Browsable(true)属性来隐藏属性/显示取决于类中另一个属性的值。我不会尝试在这里描述TypeProviderTypeDescriptor 的工作原理,因为这是一个相当冗长的主题,而且网上已经有很多关于这个主题的信息。

此外,您需要在属性上指定[RefreshProperties(RefreshProperties.All)] 属性,以控制另一个属性是否应该可见。这将强制 propertygrid 在其值更改时重新查询 TypeDescriptor 以获取属性列表,从而使您的 TypeDescriptor 有机会返回一组不同的属性,或者它返回的属性的不同属性。

我希望这至少可以为您指明正确的方向。不幸的是,将这些东西粘合在一起需要相当多的工作。

【讨论】:

    【解决方案2】:

    以下是更改 JointItem 类中属性的 Browsable 属性的方法:

    private void ChangeBrowsability(object pThis, string pProperty, bool pBrowsable)
    {
        PropertyDescriptor pdDescriptor = TypeDescriptor.GetProperties(pThis.GetType())[pProperty];
        BrowsableAttribute baAttribute = (BrowsableAttribute)pdDescriptor.Attributes[typeof(BrowsableAttribute)];
        FieldInfo fiBrowsable = baAttribute.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance);
        fiBrowsable.SetValue(baAttribute, pBrowsable);
    }
    

    那么你可以有一个很大的 if then else 序列或类似的东西:

    JointItem jiThis = WhereEverYouGetYourJointItemFrom();
    if (jiThis.JointType == eJoinType.Elbow)
    {
        ChangeBrowsability(jiThis, "JointAngle", true);
        ChangeBrowsability(jiThis, "MinAngle", true);
        ChangeBrowsability(jiThis, "MaxAngle", true);
        ChangeBrowsability(jiThis, "ScrewType", false);
        //...
    }
    else ...
    

    你当然需要你的“使用”剂量!

    using System.ComponentModel;
    using System.Reflection;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-19
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2012-05-30
      相关资源
      最近更新 更多