可在单独项目中自定义GUI控件

时间:2012-03-22 13:22:19

标签: c# .net winforms dependency-injection

winclient正在使用来自单独的GUI项目的GUI控件(BaseForm,BaseTextBox,BaseComboBox),该项目也用于其他项目

这些控件在聚焦时将backgroundcolor更改为yellow-ish,并在焦点离开时保留旧的backgroundcolor。 (onEnter和OnLeave事件)

现在,这个winclient将让用户选择自己的焦点颜色。我知道我可以直接在所有控件上设置“FocusColor”属性,但这不是我想要的(有很多控件)

最好的方法是什么?我想也许我可以在控件中注入某种“CustomColorProvider”并重写GUI项目以从“StandardColorProvider”获取焦点颜色。但我并不完全知道这些控件应如何注入“CustomColorProvider”。 (我对DI不太熟悉)控件是通过设计器添加的,控件的创建是通过自动生成的代码“部分设计师类”

或许我应该在这个特定的winclient中编写新的控件,它继承自GUI项目,然后覆盖设置focuscolor的方法?

我可以访问并允许修改winclient和GUI项目。

2 个答案:

答案 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方法中使用它。