winclient正在使用来自单独的GUI项目的GUI控件(BaseForm,BaseTextBox,BaseComboBox),该项目也用于其他项目
这些控件在聚焦时将backgroundcolor更改为yellow-ish,并在焦点离开时保留旧的backgroundcolor。 (onEnter和OnLeave事件)
现在,这个winclient将让用户选择自己的焦点颜色。我知道我可以直接在所有控件上设置“FocusColor”属性,但这不是我想要的(有很多控件)
最好的方法是什么?我想也许我可以在控件中注入某种“CustomColorProvider”并重写GUI项目以从“StandardColorProvider”获取焦点颜色。但我并不完全知道这些控件应如何注入“CustomColorProvider”。 (我对DI不太熟悉)控件是通过设计器添加的,控件的创建是通过自动生成的代码“部分设计师类”
或许我应该在这个特定的winclient中编写新的控件,它继承自GUI项目,然后覆盖设置focuscolor的方法?
我可以访问并允许修改winclient和GUI项目。
答案 0 :(得分:1)
正如您所提到的,我会使用Decorator模式,根据您想要扩展控件的方式传递不同的具体装饰器。您可以找到示例here。
编辑:
声明接口 IControlExtender
public interface IControlExtender
{
Color BackColor { get; }
Color HighlightColor { get; }
}
创建默认实现
class DefaultExtender : IControlExtender
{
public Color BackColor
{
get { return Color.Yellow; }
}
public Color HighlightColor
{
get { return Color.Red; }
}
}
向GUI控件添加属性
IControlExtender _extender = new DefaultExtender();
public IControlExtender Extender
{
get { return _extender; }
set
{
if ((value != null) && (value != _extender))
{
_extender = value;
RefreshControl();
}
}
}
void RefreshControl()
{
this.BackColor = Extender.BackColor;
}
创建任何新的实现,例如
class CustomExtender:IControlExtender
{
public Color BackColor
{
get { return Color.Green; }
}
public Color HighlightColor
{
get { return Color.Pink; }
}
}
并根据需要覆盖默认值
public Form1()
{
InitializeComponent();
control1.Extender = new CustomExtender();
}
答案 1 :(得分:0)
我认为你的GUI控件为OnEnter和OnLeave事件添加了一个处理程序,我将尝试使用一个接受另一个参数的新方法扩展该方法,即你想要的颜色。然后全局保存该颜色并在OnEnter方法中使用它。