帮助我找到更好的编程方法

时间:2010-08-17 04:55:58

标签: c# .net design-patterns

我的应用程序有一组从几乎所有UI控件派生的基类 XCombobox,XButton,XMenu等除了标准功能外,所有这些类都有一些额外的功能(例如:序列化功能)

我在测试窗口应用程序中使用了所有这些控件。

我想在我的应用程序中实现一个类似于主题的概念。

Ex:说我是否需要蓝色背景

我在所有控件中都公开了一个公共属性,用于设置我的控件 (即XButton和XMenu)背景颜色为蓝色

我觉得这种做法很蹩脚。明天,如果我的经理想要其他一些造型。 我将不得不去每一个控制并一个接一个地改变背景......不是我的想法;)....但这从来没有让我成为一个优秀的程序员。

设计模式的某些应用时间(我应该说战略模式?)

是否有可能我只能在一个中央位置进行更改,该属性将应用于我的所有UI控件?

如果是的话......请帮助我实现同样的目标。 如果不是......欢迎提出一些更好的想法。

6 个答案:

答案 0 :(得分:2)

定义一个具有颜色属性的类(您还可以添加徽标属性等)。

然后要么在该类的代码中包含常量,要么从某些XML中读取它们。

答案 1 :(得分:1)

你已经回答了你的问题。

在中心属性中定义样式的常量,并在UI组件中使用这些样式常量:)。

答案 2 :(得分:1)

我会使用依赖注入容器,例如Unity,它允许您在一个位置注册主题,并让所有控件在需要时解析主题。

例如,实现一个简单的接口,该接口具有每个控件将使用的主题属性。

interface IXTheme {
    Color BackColor { get; }
}

无论你的控件需要获取它,例如在OnPaintBackground中,你都可以使用CommonServiceLocator进行简单的调用来获取颜色(这已经与Unity一起打包了。)

protected override void OnPaintBackground(PaintEventArgs pevent)
{
    Color backColor = ServiceLocator.Current.GetInstance<IXTheme>().BackColor;
    ///...
}

现在,您可以根据该界面在其他地方创建主题。

class XBlueTheme : IXTheme {
     Color IXTheme.BackColor { get { return Color.Blue; } }
}

然后,您可以使用容器注册主题,并使用容器来解析表单。

IUnityContainer container = new UnityContainer()
    .RegisterType<IXTheme, XBlueTheme>();
IServiceLocator locator = new UnityServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => locator);

XForm myForm = container.Resolve<XForm>();

答案 3 :(得分:0)

从你的说法来看,似乎你只是想改变颜色,最简单的方法就是将颜色保存在变量的某个地方,或者拥有某种初始化函数,每个组件都调用你的位置可以指定颜色等共享的东西 此外,由于您提到要为组件添加其他功能,因此您可能希望使用Decorator设计模式来实现此目的。

答案 4 :(得分:0)

您可以制作.net网络项目中提供的.skin文件。或者只是一个xml文件;例如,

  1. 制作一个.skin文件,并在那里添加控件和样式定义。
  2. 在控件基类的某些公共属性中添加.skin文件路径。
  3. 添加事件OnDraw,所有控件都覆盖并使用.skin中定义的颜色自行着色。
  4. 最好尝试使用现有的.skin文件;虽然我不确定您打算如何解析.skin文件。

    <TextBox BackColor="Red" ForeColor="Blue"/>
    <Button BackColor="White" ForeColor="Green"/>
    <DropDownList BackColor="Cyan" ForeColor="Pink"/>
    

    您甚至可以通过添加cssClass属性来扩展皮肤文件;并根据css文件中定义的css类添加样式。

    <TextBox cssClass="TextLoginField"/>
    <DropDownList cssClass="ComboLongList" />
    

    大声思考!顺便说一句,this article可能会给你一个见解。

答案 5 :(得分:0)

我猜你提到的策略模式最适合。 那本书Head Fisrt Design patterns很好地描述了这个问题。 你需要一个接口,说IStyle定义为你的基类的成员,这样样式行为将独立于你的控件继承。