【问题标题】:Hide property in PropertyGrid without affecting Visual Studio Live Property在 PropertyGrid 中隐藏属性而不影响 Visual Studio 实时属性
【发布时间】:2019-11-04 02:52:03
【问题描述】:

将属性[Browsable(false)] 应用于属性时,wpfookit 的PropertyGrid 不再列出该属性(这是我的目标)。

但是,Visual Studio 工具“实时属性编辑器”也停止显示此属性。这不是我的目标,而且会降低调试能力。

我当然可以使用以下编译器条件:

#if DEBUG
[Browsable(false)]
#endif DEBUG

但这会使属性在使用调试版本时重新出现在 PropertyGrid 中(我主要在开发过程中这样做)。

有没有办法让属性在“实时属性编辑器”中可见但从 PropertyGrid 中删除?

【问题讨论】:

    标签: c# wpf wpftoolkit


    【解决方案1】:

    您可以在运行时使用 TypeDescriptors 和 TypeConvertors 执行此操作,方法是确定您是在 Visual Studio 中还是作为程序运行。

    还有另一个堆栈溢出答案:C# PropertyGrid => How to change visible Properties at Runtime 可以给出一些指针。

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

    正如您已经发现的那样,控制属性是否为 可见与否是 BrowsableAttribute。所以基本上你需要 动态更改此属性,方法是创建 您自己的 TypeProvider 和 TypeDescriptor 为您的课程,即 动态返回 Browsable(false) 或 Browsable(true) 属性 根据另一个属性的值隐藏/显示属性 类中的财产。我不会尝试描述 TypeProvider 如何 和 TypeDescriptor 在这里工作,因为它是一个相当长的主题,并且 网上有很多关于这个主题的信息 已经。

    此外,您还需要指定 属性上的 [RefreshProperties(RefreshProperties.All)] 属性 控制另一个属性是否应该可见。这 将强制 propertygrid 重新查询列表的 TypeDescriptor 每当其值发生变化时的属性,给你 TypeDescriptor 有机会返回一组不同的属性,或者 它返回的属性的不同属性。

    【讨论】:

    • 是的,我之前找到了您引用的链接。但我看不出有任何辨别 PropertyGrid 和 Live Property Editor 的机会。
    • 我建议归结为托管过程。当它是你自己的程序和它的视觉工作室时,它可能会有所不同。这里有一些示例,说明如何检测您何时处于 Visual Studio 的设计模式。
    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 2019-01-07
    • 1970-01-01
    • 2013-09-26
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多