如题,我用C#开发了一个自定义控件,然后再系统中很多窗口中引用了这个控件。
我想要的效果是,在系统主窗口内改变这个控件的属性,然后所有窗口引用的这个控件属性全都跟着改变。注:希望大侠们帮帮忙,谢谢了~~~分不够再加。

解决方案 »

  1.   

    不同窗体的引用的控件应该还是不同的实例吧。如果要达到你要的效果,可以考虑将那个属性用static修饰。
      

  2.   

    自己写一个xml文件,每打开一个窗体,都从这里读配置...
      

  3.   

    对哦,我也在想, 这个皮肤一改,是触发什么事件了吗,触发重新加载窗口吗,加载的窗口了应该不会改变属性的吧,因为这些属性都是在ini就加载了的啊.
      

  4.   

    控件通过配置文件获取属性如xml等
    修改XML文件
      

  5.   

    可以做一个单例类
    public class ControlService
    {
        private static ControlService service = null;
        public ControlService GetInstance()
        {
    if( null == service )
    {
      service = new ControlService();
    }
    return service;
        }    public event EventHandler notifyHandler;public void CallNotifyHandler(object sender, EventArgs e)
            {
                EventHandler tmp = notifyHandler;
                if (null != tmp)
                {
                    tmp(sender, e);
                }
            }
    }每个窗体都向这个单例类注册事件,属性改变的时候调用CallNotifyHandler来通知每个窗体来更改属性
      

  6.   

    可以用静态成员做的。但是不用事件通知。
    你把所有的实例都放到一个List里面存起来就可以了。不过这样做有个缺陷, 就是所有控件的实例不会被GC回收了。
    因为永远有一个静态类抓着它。
    如果要再解决GC的问题, 就要再复杂一点。
    这里只是提供个思路。示例代码如下:
    namespace ConsoleApplication11
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyControl control = new MyControl();
                control = new MyControl();
                control = new MyControl();
                control = new MyControl();
                control = new MyControl();
                control = new MyControl();            MyControl.Skin = "test";
            }    }
        public class MyControl
        {
            private static string _skin = string.Empty;
            public static List<MyControl> _instances = new List<MyControl>();        public MyControl()
            {
                _instances.Add(this);
            }        public static string Skin
            {
                get
                {
                    return _skin;
                }
                set
                {
                    _skin = value;
                    foreach (MyControl c in _instances)
                    {
                        // 你的更新逻辑
                        c.Refresh();
                    }
                }
            }        public void Refresh()
            {
                Console.WriteLine(this.GetHashCode() + "已经被更新!");
            }
        }
    }
      

  7.   

    你可以在析构函数或者Dispose里面, 移除自己在List里的引用。不过可能在不同情况下引发的异常也比较多。
    要小心处理了。
      

  8.   

    不对, 放到析构函数的话应该是永不执行。
    因为析构在remove之后。那就放到Dispose里面好了。或者用的不多的话不管也没多大事。只能连续回复三次。
      

  9.   

    调用静态方法,所有实例改变效果 
    public partial class CustomControl1 : Control
    {
    public CustomControl1()
    {
    InitializeComponent();
    ShowMsg += new OneStr(CustomControl1_ChangeSkin);
    }
    void CustomControl1_ChangeSkin(string msg)
    {
    myText = msg;
    this.Invalidate();
    }
    private string myText="默认的"; public delegate void OneStr(string msg);
    public static event OneStr ShowMsg; /// <summary>
    /// 这个方法的调用影响所有实例
    /// </summary>
    /// <param name="msg"></param>
    public static void RaiseChange(string msg)
    {
    ShowMsg(msg);
    } protected override void OnPaint(PaintEventArgs pe)
    {
    // TODO: 在此处添加自定义绘制代码 // 调用基类 OnPaint
    base.OnPaint(pe);
    pe.Graphics.DrawString(myText, Font, Brushes.Red, PointF.Empty);
    }
    }
      

  10.   

    刚才又试了一下,是我有一部分代码没写好,已达到我想要的效果了,太感谢了 zzx509,其它回帖朋友一并感谢!分不太多,大家都分一分吧。
      

  11.   

    如果调用静态方法时其它实例还未创建,之后动态创建的话就是初始状态了。
    所以还是要静态属性,将静态方法RaiseChange在set时调用。