Code Bye

这样写调不出窗体吗?

 

   //登陆回调函数
        public void login_result(object sender,Server_Login login)
        {
            if (login.login_result == 4)
            {
                fmPlatform fmp = new fmPlatform();
                fmp.Show();
            }
            else
            {
                MessageBox.Show(login.login_result_info);
            }
        }

当返回值等于4的时候,窗体闪一下,但调用的窗体不出来,这样写调不出吗?

#1

呵呵,真是好奇怪啊

#2

你showdialog试试

#3

fmPlatform fmp = new fmPlatform();
这是一个临时变量,超出作用范围之后就自动销毁了。

#4

1.先把代码写进form_load里,看是不是窗体本身的问题,比如窗体代码里执行了hide(),close()之类的
2.如果直接调用能出来,那么再确认你的login_result回调函数到底在哪里执行的,是主线程还是子线程

#5

回复3楼:

fmp是被销毁了,但是窗体不会无缘无故的被销毁

#6

fmp被销毁的时候会调用窗体的Dispose,这样就会关闭窗体啊!

#7

回复6楼:

依你的逻辑来说,winform中就不存在非模态窗体了,因为show过之后,窗体就自动销毁
除非把窗体句柄变成全局或静态的?
麻烦你在某个按钮里执行
form1 fm=new form1();
fm.Show();
自己测试之后再说

#8

form1 fm=new form1();中的fm只不过是个变量,引用类型,它指向的是form1的实例
fm即使销毁,也不代表form1的实例也会跟着销毁

#9

放其他地方是能调出窗体的

#10

回复2楼:

不行

#11

            Form1 fm1 = new Form1();
            Form1 fm2 = fm1;
            Form1 fm3 = fm2;
            Form1 fm4 = fm3;
            fm4.Show();

            fm1 = null;
            fm2 = null;
            fm3 = null;
            fm4 = null;
即使这样也没有任何问题
fm4被销毁,跟fm3没有任何关系
fm3被销毁,跟fm2也没有任何关系
它们不过是些引用类型的变量罢了

引用类型的变量是否被销毁,跟被引用的对象有直接的关系?

#12

回复9楼:

那么只能找你回调函数的原因了
你是否把它写在某个线程函数里了?

#13

回复7楼:

复习一下变量的生命周期吧。一个Object要存活,起码要有个变量引用它。你现在唯一引用它的变量超出作用范围后,这个窗体就变垃圾收集器收集了。

#14

回复12楼:

对的,那这样该怎么写

#15

回复13楼:

你应该在主线程里注册回调函数,不要在子线程里注册回调函数.
否则变成回调函数在子线程里执行了.
如果必须在子线程里执行注册,那么使用委托,把它委托给主线程执行
搜一搜:委托操作UI,代码一大把

40分

#16

或者回调函数注册还在子线程注册
但是show窗体的时候使用委托,让主线程打开窗体
而不是子线程里new窗体

#17

回复15楼:

#18

   App.Current.Dispatcher.Invoke(new Action(() =>
           {
  fmPlatform fmp = new fmPlatform();
                fmp.Show();
}));

试试


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明这样写调不出窗体吗?