C# PropertyGrid - 使所有属性不粗体

发布于 2024-12-05 07:27:36 字数 297 浏览 1 评论 0原文

在 PropertyGrid 表单元素中,当我向类别添加属性时,某些属性会以粗体显示。
现在,我知道这表明它们是该类别中的默认值。我的问题是如何使所有属性变为粗体?
我知道一种可能的方法是更改​​ DefaultValueAttribute 属性,但我想知道是否可以以不同的方式完成: 这篇文章建议我可能必须使用反射,目前这对我来说有点神秘:)
先感谢您

In a PropertyGrid form element, when I add properties to my categories, some appear in Bold.
Now, I know that it suggests that they are the default values in that category. My question is how to make all properties not bold?
I know one possible way is changing the DefaultValueAttribute attribute, but I was wondering if it can be done in a different way: this post suggests that I might have to use reflections, which is kind of mystical for me at the moment :)
Thank you in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

べ映画 2024-12-12 07:27:37

在您自己的属性上使用[默认]属性,否则您可以执行以下可怕的黑客操作(风险自负)。

在.Net Framework 4.7.2 中尝试过。您也会失去类别上的粗体。

class MyNoBoldPropertyGrid : PropertyGrid
{
    private void SetFontNoBold()
    {
        if (!DesignMode)
        {
            object lv = Controls[2];
            Type lvType = lv.GetType();
            FieldInfo pi = lvType.GetField("fontBold", BindingFlags.Instance | BindingFlags.NonPublic);
            if (pi != null)
            {
                pi.SetValue(lv, Font);
            }
        }
    }
    protected override void OnPaint(PaintEventArgs pevent)
    {
        SetFontNoBold();
        base.OnPaint(pevent);
    }           

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x210) // WM_PARENTNOTIFY
            SetFontNoBold();        
        base.WndProc(ref m);
    }
}

Use [Default] Attribute on your own properties, otherwise you can do -at your very own risk- the following horrible hack.

Tried in .Net Framework 4.7.2. You'll loose the bold on categories aswell.

class MyNoBoldPropertyGrid : PropertyGrid
{
    private void SetFontNoBold()
    {
        if (!DesignMode)
        {
            object lv = Controls[2];
            Type lvType = lv.GetType();
            FieldInfo pi = lvType.GetField("fontBold", BindingFlags.Instance | BindingFlags.NonPublic);
            if (pi != null)
            {
                pi.SetValue(lv, Font);
            }
        }
    }
    protected override void OnPaint(PaintEventArgs pevent)
    {
        SetFontNoBold();
        base.OnPaint(pevent);
    }           

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x210) // WM_PARENTNOTIFY
            SetFontNoBold();        
        base.WndProc(ref m);
    }
}
深居我梦 2024-12-12 07:27:36

对于每个属性,您可以添加:

private bool ShouldSerialize{PropertyName}() { return false; }

除此之外,您还可以通过 ICustomTypeDescriptorTypeDescriptionProvider 进入自定义 PropertyDescriptor 实现领域。

请注意,此模式在许多地方使用,但在某些地方(例如 XmlSerializer),它需要是 public 方法。

For each property, you can add:

private bool ShouldSerialize{PropertyName}() { return false; }

Other than that, you are into the realm of custom PropertyDescriptor implementations via ICustomTypeDescriptor or TypeDescriptionProvider.

Note that this pattern is used in a number of places, but in some (XmlSerializer, for example), it is required to be a public method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文