使用更改所有实例的静态字段更改类的所有实例中的字段

时间:2013-11-08 17:22:30

标签: c# .net winforms oop

我创建了一个继承自Button类的用户定义控件,我希望能够轻松地一次更改所有按钮的视觉样式,而无需将每个实例控件放在一个集合,不得不迭代它们来改变特定的领域。

问题

我可以使用静态字段来更改父级的base类中的另一个非静态字段吗?

这是一个简短的例子:

public class KewlButton : Button
{
    /// <summary>
    /// Changes visual properties of the control in all instances at once.
    /// </summary>
    class Crossdress
    {
        static Color BackColor { 
            private get;

            set {
                // Set the BackColor in all instances of KewlButton
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您可以定义一些静态事件静态委托,这里是委托

public class KewlButton : Button {
  public delegate void SetBackColor(Color color);
  static SetBackColor setBackColor;
  public KewlButton(){
    setBackColor += ChangeBackColor;
    Disposed += (s,e) => {
       setBackColor -= ChangeBackColor;
    };
  }
  private void ChangeBackColor(Color color){ 
     BackColor = color;
  }
  public class Crossdress {
    public static Color BackColor { 
        set {
            if(setBackColor!=null) setBackColor(value);
        }
    }
  }
}

//Usage
KewlButton.Crossdress.BackColor = Color.Red;

使用事件委托非常相似。

答案 1 :(得分:0)

实现这一目标的最简单方法是将您想要控制的所有颜色分离为完全不同的类。

class MyTheme { 
  public Color BackColor { get; set; } 
  public Color OtherColor { get; set; } 

  public event EventHandler Changed;
}

此类还将具有在任何值更改的情况下引发的事件。然后,您可以将此类型的实例传递给应用程序中的每个Control,并让它们使用它来进行所有颜色访问