前情提要:最近公司同事在做WPF的多个客户端的项目,客户端之间的通信是通过服务器转发实现的。

出现的问题:1.客户端A点击按钮a,A显示界面P正常,客户端B显示界面P正常;但是界面P跳转到界面P1后会出现很多界面;

                      2.修改之后,又报错:关闭 Window之后,无法设置 Visibility,也无法调用 Show、ShowDialogor等等;

当时看了代码第一反应是实例有问题,close()方法不会销毁你的实例,导致每次点击都会增加一个实例。看到这里自然而然就想到了单例模式。虽然简单,但是实用啊,哈哈哈!

但是我是第一次接触C#,很多东西也不是很清楚,有不对的,欢迎大家指正;

1.界面P、P1都需要写一个单例的接口:

//P
        static P p_instance = null;
        static public P instance()
        {
            if (p_instance == null)
                p_instance = new P();
            return p_instance;
        }
//P1
        static P1 p1_instance = null;
        static public P1 instance()
        {
            if (p1_instance == null)
                p1_instance = new P1();
            return p1_instance;
        }

2.界面P中的事件:

public void ToP1()
        {
            Dispatcher.BeginInvoke(new Action(delegate 
            {
                this.Close(); //关闭界面P
                if(p_instance != null)
                    p_instance.Close(); //关闭多余的P
                p_instance = null; //销毁P,保证下次打开是一个新的P
                
                P1.instance().Show(); //打开界面P1
            }));
        }

3.界面P1中的事件:

public void ToP()
        {
            Dispatcher.BeginInvoke(new Action(delegate 
            {
                this.Close(); //关闭界面P1
                if(p1_instance != null)
                    p1_instance.Close();
                p1_instance = null;
                
                P.instance().Show(); //打开界面P
            }));
        }

客户端A和客户端B的代码是完全一样的,这样操作就好了,没有多余的界面,也不会报错。

如果哪里写的有问题,欢迎大家指出来!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐