为集合设置公共属性控制

时间:2015-07-06 17:11:17

标签: c# reusability

我在一个重新绘制表单内某些控件的函数内部,它实现为ControlCollection类的扩展方法,如下所示:

void SetColorsCorrespondingToVisualStudioTheme(this Control.ControlCollection controls)
{
  foreach (var control in controls)
  {
  ...

在此方法中,设置一些控件的公共GUI属性的代码:

  ...
    if (controlType == typeof(TreeView))
    {
      ((TreeView)control).BorderStyle = BorderStyle.None;
      ((TreeView)control).BackColor = EditorBackgroundColor;
      ((TreeView)control).ForeColor = FontColor;
      continue;
    }

    if (controlType == typeof(TextBox))
    {
      ((TextBox)control).BorderStyle = BorderStyle.None;
      ((TextBox)control).BackColor = EditorBackgroundColor;
      ((TextBox)control).ForeColor = FontColor;
    }
 ...

我想知道是否有一种方法可以重构代码,如:

    if (controlType == typeof(TreeView) || controlType == typeof(TextBox))
    {
      ((controlType)control).BorderStyle = BorderStyle.None;
      ((controlType)control).BackColor = EditorBackgroundColor;
      ((controlType)control).ForeColor = FontColor;
    }

上面的代码显然不起作用,因为controlType是一个变量而不是一个类型,但我正在尝试做的意图是重要的。我也试过了:

((typeof(controlType))control).B...

我现在能想到的唯一选择是为基本类型(TreeView,TextBox等)创建自定义控件,并使它们全部实现一个通用接口,以便我可以互换使用它们:

 ...
    if (controlType == typeof(TreeView) || controlType == typeof(TextBox))
    {
      //CustomControl() ñ 
      ICustomControl newControl = new CustomControl(control);      
      newControl.BorderStyle = BorderStyle.None;
      newControl.BackColor = EditorBackgroundColor;
      newControl.ForeColor = FontColor;
    }
...
    public class CustomTreeView : ICustomControl
    {
...
    public class CustomTextBox : ICustomControl
    {
...
    public interface ICustomControl
    {
       public BorderStyle BorderStyle {get; set;}
       public Color BackColor {get; set;}
       public Color ForeColor {get; set;}
...

但是(至少在我脑海中)听起来比保持倍数if更糟糕。 我错过了解决这个问题的另一种方法吗?

2 个答案:

答案 0 :(得分:1)

if (control is TreeView || control is TextBox)
{
  ((Control)control).BorderStyle = BorderStyle.None;
  ((Control)control).BackColor = EditorBackgroundColor;
  ((Control)control).ForeColor = FontColor;
}

答案 1 :(得分:1)

我可能会创建一个结构来保持属性的所需值,以及一个采用Control类型的参数并在其上应用样式的方法:

struct ThemeStyle
{
    ThemeStyle(Color backColor, Color foreColor, BorderStyle borderStyle)
    {
        this.BackColor = backColor;
        this.ForeColor = foreColor;
        this.BorderStyle = borderStyle;
    }
    public Color BackColor {get; private set;}
    public Color ForeColor {get; private set;}
    public BorderStyle BorderStyle {get; private set;}

    public void Apply(Control c)
    {
        c.BackColor = this.BackColor;
        switch(typeof(c))
        {
             case typeof(TreeView):
             case typeof(TextBox):
               c.BorderStyle = this.BorderStyle;
             break;
        }
    }
}

注意:此代码只是一个演示,使用手机直接写在这里。可能会有一些错误。

然后在循环中,您需要做的就是使用控件调用Apply方法。