C#PropertyGrid-使所有属性不加粗
在PropertyGrid表单元素中,当我将属性添加到类别中时,有些属性以粗体显示。C#PropertyGrid-使所有属性不加粗,c#,winforms,propertygrid,C#,Winforms,Propertygrid,在PropertyGrid表单元素中,当我将属性添加到类别中时,有些属性以粗体显示。 现在,我知道这表明它们是该类别中的默认值。我的问题是如何使所有属性不加粗? 我知道一种可能的方法是更改DefaultValueAttribute属性,但我想知道是否可以用另一种方法:建议我可能必须使用反射,这在目前对我来说有点神秘:) 提前感谢您对于每个属性,您可以添加: private bool ShouldSerialize{PropertyName}() { return false; } 除此之外,您
现在,我知道这表明它们是该类别中的默认值。我的问题是如何使所有属性不加粗?
我知道一种可能的方法是更改DefaultValueAttribute属性,但我想知道是否可以用另一种方法:建议我可能必须使用反射,这在目前对我来说有点神秘:)
提前感谢您对于每个属性,您可以添加:
private bool ShouldSerialize{PropertyName}() { return false; }
除此之外,您还可以通过ICustomTypeDescriptor
或TypeDescriptionProvider
进入自定义PropertyDescriptor
实现的领域
请注意,此模式在许多地方都使用,但在某些地方(例如,
XmlSerializer
),它必须是public
方法。在您自己的属性上使用[Default]属性,否则您可以进行以下可怕的攻击,风险由您自己承担
已在.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);
}
}
那论坛第9条消息中的建议呢?似乎更general@bks这就是我上面提到的“custom
PropertyDescriptor
”路线;当然,您可以做到这一点,但这并不是一件小事——至少,您需要先编写一个菊花链PropertyDescriptor
。