我将自定义渲染器用于ContextMenuStrip
。它工作正常,但我不知道如何在类Form1
中使用外部类MyColors
的字段?我应该从customColor
获得Form1
,而不是“硬编码” Color.Green
。我该如何实现?
public partial class Form1
{
private Color customColor = Color.Red;
private class MyRenderer : ToolStripProfessionalRenderer
{
public MyRenderer() : base(new MyColors()) { }
}
private class MyColors : ProfessionalColorTable
{
public override Color MenuItemSelected
{
get { return Color.Green; }
}
}
}
谢谢。
答案 0 :(得分:4)
总的来说,我同意其他张贴者的观点,即一个班级应该独立存在。不过,我认为在处理私人课程时会变得有些模糊。
在少数情况下,我需要这样的东西,我将父对象传递给私有类的构造函数:
public partial class Form1
{
public Color customColor = Color.Red;
private class MyRenderer : ToolStripProfessionalRenderer
{
public MyRenderer(Form1 form) : base(new MyColors(form)) { }
}
private class MyColors : ProfessionalColorTable
{
Form1 _form;
public MyColors(Form1 form)
{
_form = form;
}
public override Color MenuItemSelected
{
get { return _form.customColor; }
}
}
}
请注意,我必须公开Form1.customColor
才能使此工作生效。这有点臭,尤其是因为现在可以从外面分配它了。在实际工作中,我会将其设置为具有公共获取器和私有设置器的属性,以便外部类无法对其进行修改。
答案 1 :(得分:1)
您将以这种方式破坏封装。如果您需要一个包含的类来从其包含的类中了解某些内容,则应在包含的类的构造函数中提供此类信息。
否则,您将让另一个类更改类的属性,从而无法控制Form1
内部发生的事情。
考虑到您的代码,看来ProfessionalColorTable
有一个无参数的构造函数,因此如果未设置MyColors
的指向包含类的颜色的私有变量,则应该包含一个验证。使用错误的构造函数)。