【问题标题】:Change field in all instances of a class using a static field that changes all the instances使用更改所有实例的静态字段更改类的所有实例中的字段
【发布时间】:2013-11-20 19:28:03
【问题描述】:

我创建了一个用户定义的控件,它继承自 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
            }
        }
    }
}

【问题讨论】:

  • 您可能必须进行某种所有实例都订阅的事件。
  • 您能否编写KewlButton 代码,以便在绘制自身时从静态属性(不必在同一个类中)读取背景颜色?如果您可以在设置静态属性时使整个窗口无效,从而强制所有按钮重绘,那么这可能会起到作用。

标签: c# .net winforms oop


【解决方案1】:

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

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;

event的使用和delegate很相似。

【讨论】:

  • delegate 一起工作就像一个魅力。另外,我使用protected 作为访问修饰符,因为我不希望委托在外部可用。谢谢。
【解决方案2】:

实现这一点的最简单方法是将所有要控制的颜色分离到一个完全不同的类中。

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

  public event EventHandler Changed;
}

如果任何值发生更改,此类也会引发一个事件。然后,您可以将这种类型的实例传递给应用程序中的每个控件,并让他们将其用于所有颜色访问

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多