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;
我想在加载 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;