WinForm PropertyGrid 更改帮助区域中的文本

WinForm PropertyGrid change text in Help area

我想在加载 PropertyGrid 后更改 WinForm PropertyGrid 帮助区域中的文本。这是我使用反射的 2 次尝试,但它们都无法正常工作。

解决方案1:我继承了PropertyGrid 并检索了文档注释,它是帮助区域的控件。我有一个单独的按钮调用 ChangeHelpText 方法来更改文档注释的文本 属性。之后,我调用 PropertyGrid 的 Refresh 方法。但是,没有任何变化。我还分配了 PropertyGrid 的 HelpBackColor,也没有任何变化。有什么想法吗?

public void ChangeHelpText(String desc)
{
    FieldInfo fi = this.GetType().BaseType.GetField("doccomment", BindingFlags.NonPublic | BindingFlags.Instance);
    Control dc = fi.GetValue(this) as Control;
    dc.Text = desc;
    dc.BackColor = Color.AliceBlue;
    fi.SetValue(this, dc);
}   

解决方案 2:PropertyGrid 的帮助文本反映了绑定中属性的 DescriptionAttribute class。因此,我使用 TypeDescriptor.GetProperties 检索 PropertyGrid 的 SelectedObject 的所有属性,遍历它们并检索 DescriptionAttribute,并使用反射将 DescriptionAttribute 的描述私有字段更改为我的文本。有趣的是,如果我在重新分配 DescriptionAttribute 的位置放置一个断点,则此解决方案部分起作用,因为只有某些属性的 DescriptionAttribute 发生更改并反映在 PropertyGrid 中,而其他属性则没有更改。如果我不设置断点,则什么都不会改变。 STAThread 中的所有内容都是 运行。

第一个解决方案不起作用,因为您正在设置控件的 Text 属性,它不用于显示帮助文本。 DocComment控件有两个标签child控件,分别用于显示帮助标题(属性标签)和帮助文本(属性描述属性值)。如果您想更改帮助文本,您可以操作这两个标签。

只调用更新这两个控件的方法更简单。下面给出的示例代码有效,但使用反射来调用该方法。

public class CustomPropertyGrid : PropertyGrid
{
    Control docComment = null;
    Type docCommentType = null;

    public void SetHelpText(string title, string helpText)
    {
        if (docComment == null)
        {
            foreach (Control control in this.Controls)
            {
                Type controlType = control.GetType();
                if (controlType.Name == "DocComment")
                {
                    docComment = control;
                    docCommentType = controlType;
                }
            }
        }
        BindingFlags aFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
        MethodInfo aInfo = docCommentType.GetMethod("SetComment", aFlags);
        if (aInfo != null)
        {
            aInfo.Invoke(docComment, new object[] { title, helpText });
        }
    }
}

要更改背景色和前景色,请使用 PropertyGrid 提供的属性。

propertyGrid1.HelpBackColor = Color.BlueViolet;
propertyGrid1.HelpForeColor = Color.Yellow;