public partial class ET_member_talk : Form
    {
        private string withTalkerUIDHoneyName = "";        private string _UID = "";        private string _Honey_name = "";        /// <summary>
        /// UID
        /// </summary>
        public string UID
        {
            get { return _UID; }
            set { _UID = value; }
        }        /// <summary>
        /// 昵称
        /// </summary>
        public string Honey_name
        {
            get { return _Honey_name; }
            set { _Honey_name = value; }
        }        /// <summary>
        /// 简单字符,格式:昵称(UID)
        /// </summary>
        public string WithTalkerUIDHoneyName
        {
            get { return withTalkerUIDHoneyName; }
            set
            {
                if (value == "")
                { }
                else
                {
                    //例如:Tony(123456789)
                    string[] temp_str1 = value.Split(new char[] { '(' });//Tony  123456789)
                    Honey_name = temp_str1[0];//Tony
                    string[] temp_str2 = temp_str1[1].Split(new char[] { ')' });//123456789  )
                    UID = temp_str2[0];//123456789
                    withTalkerUIDHoneyName = value;
                }
            }
        }        public ET_member_talk(string _withTalkerUIDHoneyName)
        {
            InitializeComponent();
            WithTalkerUIDHoneyName = _withTalkerUIDHoneyName;
            this.Text = "与 " + WithTalkerUIDHoneyName + " 聊天中...";
        }
     }class Common
{
...
        /// <summary>
        /// 用于显示新建与成员聊天窗口的函数
        /// </summary>
        /// <param name="withTalkerUIDHoneyName">与要聊天的成员的UID和HONEY_NAME,如:UID(HONEY_NAME)</param>
        public static void et_member_talk_form(string withTalkerUIDHoneyName)
        {
            for (int i = 0; i < ET_Meber_Chatrooms.Count; i++)
            {
                if (((ET_member_talk)ET_Meber_Chatrooms[i]).WithTalkerUIDHoneyName == withTalkerUIDHoneyName)
                {
                    return;
                }
            }
            ET_member_talk temp_et_member_talk_form = new ET_member_talk(withTalkerUIDHoneyName);
            Common.ET_Meber_Chatrooms.Add(temp_et_member_talk_form);
            //temp_et_member_talk_form.ShowDialog();
            //temp_et_member_talk_form.Show();
            et_test_show(temp_et_member_talk_form);
            //temp_et_member_talk_form.TopMost = true;
        }
...
public void action ()
{
                        string sender_UID = "123456789";
                        string sender_honey_name = "Tony";
                        string talk_content = "test_content";
                        string friend_UID = "987654321";
                        string friend_honey_name = "Marry";
                        string time = "DateTime.Now.TO.....";
                        //把选所有要显示在聊天文件框里的内容存放到content字符串变量中;
                        string content = sender_honey_name + "(" + sender_UID + ")" + "  " + time + "\r\n" + talk_content + "\r\n";
                        bool isExists = false;
                        for (int i = 0; i < Common.ET_Meber_Chatrooms.Count; i++)
                        {
                            ET_member_talk temp_et_member_talk = ((ET_member_talk)Common.ET_Meber_Chatrooms[i]);
                            if (temp_et_member_talk.UID == friend_UID || temp_et_member_talk.UID == sender_UID)
                            {
                                isExists = true;
                                temp_et_member_talk.rtxtBox_talk_content.AppendText(content);
                                temp_et_member_talk.rtxtBox_send_Content.Text = "";
                            }
                        }
                        if (isExists)
                        { }
                        else
                        {
                            Common.et_member_talk_form(sender_honey_name + "(" + sender_UID + ")");
                            for (int i = 0; i < Common.ET_Meber_Chatrooms.Count; i++)
                            {
                                ET_member_talk temp_et_member_talk = ((ET_member_talk)Common.ET_Meber_Chatrooms[i]);
                                if (temp_et_member_talk.UID == friend_UID || temp_et_member_talk.UID == sender_UID)
                                {
                                    isExists = true;
                                    temp_et_member_talk.rtxtBox_talk_content.AppendText(content);
                                    temp_et_member_talk.rtxtBox_send_Content.Text = "";
                                    //temp_et_member_talk.Refresh();
                                    //Thread.Sleep(1000);
                                }
                            }
                        }
                        if (Personel_info.UID != sender_UID)
                        {
                            playSoundFromResource(Application.StartupPath + "\\sound\\msg.wav");
                        }
}
}
class Personel_info
{}代码太多了。而且部份代码调用了其它类的成员。所以我只能把主要的写出来了。现在,我的问题是,如:我执行Common类里的action()方法。到了:public static void et_member_talk_form(string withTalkerUIDHoneyName);方法的.....Show();之后,Show出来的窗口马上就消失了。运行时只看到闪了一个而我随便在Common 类里写一个:
public void test_Show()
{
 Et_member_talk et=new Et_member_talk("Tony(123456789)");
 et.Show();
}
这个随便写的方法。Show出来的窗口不会消失。就像我平时用的一样。
所以我想问问大家有没试过这样的问题?一Show出来的窗口,闪一下马上就消失了。我现在郁闷啊。

解决方案 »

  1.   

    你在代码里设置了this.ShowInTaskbar = false;//不在任务栏显示???
    如果是这样的话,在窗体属性界面里把ShowInTaskbar也设为false就不会有你说的情况了。
      

  2.   


    我没有弄隐藏任务栏我之前去查了一下,我这种情况。我在Common类中的        /// <summary>
            /// 用于显示新建与成员聊天窗口的函数
            /// </summary>
            /// <param name="withTalkerUIDHoneyName">与要聊天的成员的UID和HONEY_NAME,如:UID(HONEY_NAME)</param>
            public static void et_member_talk_form(string withTalkerUIDHoneyName)
            {
                for (int i = 0; i < ET_Meber_Chatrooms.Count; i++)
                {
                    if (((ET_member_talk)ET_Meber_Chatrooms[i]).WithTalkerUIDHoneyName == withTalkerUIDHoneyName)
                    {
                        return;
                    }
                }
                ET_member_talk temp_et_member_talk_form = new ET_member_talk(withTalkerUIDHoneyName);
                Common.ET_Meber_Chatrooms.Add(temp_et_member_talk_form);
                //temp_et_member_talk_form.ShowDialog();
                while(!temp_et_member_talk_form.IsHandleCreated)//判断句柄创建成功与否。
                {
                 ;
                }
                temp_et_member_talk_form.Show();
                //temp_et_member_talk_form.TopMost = true;
            }我发现
    temp_et_member_talk_form.Show();
    这句话执行不了了。原因是该控件句柄无法创建。CPU100%资源。就是卡在那个句柄死循环了。我就是不知道。为啥。一个小小的控件都要创建句柄这么久。不过我打了一个断点做测试。因为我temp_et_member_talk_form.Show()之后。我继续了一些网络通讯的代码.就是用了一个NetWorkStream网络流的Read(buffer,0,buffer.length);                    Byte[] buffer = new Byte[tcp_client.ReceiveBufferSize];
                        send_recieve_ns.Read(buffer, 0, buffer.Length);断点卡在Read()函数里是很正常啊。但这个与我的temp_et_member_talk_form窗口控件有啥关系?我就觉得奇怪。而且我试过。如:temp_et_member_talk_form是一个窗体控件类:Et_member_talk类我假如把Common类中的et_member_talk_form()函数改成一下简单的Et_member_talk简单的Show();这情况就很正常运行了。Et_member_talk类的窗口马上就正常的显示出来了。后来我怀疑是否是UI线程有关系。与是我就用上了该控件的.BegineInvoke();异步处理函数;但我对UI线程不了解。如果有那位大哥说一下就更好了。先谢谢一下。但用上了.BegineInvoke()函数后。又出现了一个"创建句柄未完成前使用,....(忘记了)"反正就是与Et_member_talk窗体类的.IsHandleCreated标识有关系。所以我就用上了我上面的
    while(!temp_et_member_talk_form.IsHandleCreated)
    {
    ;
    }
    但结果就是一个死循环;我现在就想知道:
    UI线程是什么呢?还有控件句柄IsHandleCreated为啥一直不行创建完成?
      

  3.   

    没有认真看,貌似主函数都没有。
    你试试ShowDialog(),因为Show方法无法维持,如果当前没有其他模式窗口存在,进程就会终止,非模式窗口不能维持进程。
      

  4.   


    代码过多了。我只能有语言说明:“从action()函数”开始的话。你可能没看到我的代码里有ShowDialog()?在//注释里的。我都试过了。C SHARP的模式窗口和非模式窗口我还怎么了解过。准确说,我没听过有这个东西。ShowDialog我试过了。可以维持,但就是会无法对该Dialog的属性控制了。如:我把temp_et_member_talk_form.ShowDialog();后因为我的temp_et_member_talk_form窗体里有两个RichTextBox,四个Button,都不可以对其控制了。但是Button里的事件还是可以执行的。如:
    public void Button_Click(object sender,EventHandle e)
    {
    this.RichTextBox.Text="Text_string";
    MessageBox.Show("this.RichTextBox.Text='Text_string'的赋值失败");
    }
    这个事件可以执行。因为Show()出了一个对话框。也有相应的对话框内容,。、但是this.RichTextBox.Text="这里输什么内容,都不在该属性显示。";
    this.RichTextBox里的显现不出内容。或我对temp_et_talk_form.Text="这里随便写字符串,都不起效果,赋不了值。";这个是就是ShowDialog()后的问题。可以维持窗口,但是控制不了该窗体内的东西。Show()的话就闪一下,就没了。就好像没有Console.ReadLine()的控制台程序一样了。闪一下,就没了。在任务栏里也出现了一下。就没了。但我的程序的其它窗口都还是执行中的。
    就是该Et_member_talk类窗体一闪就没了。
      

  5.   

    因为你那个程序不是标准应用程序消息循环,所以不会持续存在
    Application.Run(new ET_member_talk());
      

  6.   

    太多了,直接做个form,把控件都摆上,直接调出这个窗口不就得了?!要是重用多,就做成自定义控件。
      

  7.   

    不是Application.Run()函数的问题。唉CSDN没有想QQ的问问这么好。起码,QQ的有上传本地图片。便于回答者理解。但QQ的又没CSDN这么多高手。咋搞?我的代码很多。不是随便复上来就可以解决的事。而且。窗体也很多。
      

  8.   

    看着有点累,有个单词叫nickname,
    honey_name 太别扭
      

  9.   

    那有没哪位朋友试过这种 情况?窗口Show()一下就没了。
      

  10.   

    没有遇到过LZ的情况,不过如果开的窗口太多,就不能继续创建窗口了。但是也没有出现show了以后又没有的情况。这个还是要调试代码才能搞清楚,光这么看也看不出什么名堂来还有不要用那个while判断,那个时候window的handle肯定没有创建。再就是你试试如果去掉show之前的Common.ET_Meber_Chatrooms.Add(temp_et_member_talk_form);
    会怎样?
      

  11.   

    这样可以
    using System;
    using System.Windows.Forms;
    class Form1 : Form
    {
    static void Main()
    {
    Application.Run(new Form1());
    }
    }但这样就是不行的
    using System;
    using System.Windows.Forms;
    class Form1 : Form
    {
    static void Main()
    {
    Form1 f = new Form1();
    f.Show();
    }
    }
      

  12.   

    不要再线程里面new Form再Show线程结束,窗口也就没了……
      

  13.   

    对了。顺便请问一下。带参数的线程怎么弄?如:Main()
    {
         Form1 f=new Form1();     Thread temp_thread=new Thread(new ThreadStart(test));     temp_thread.Start(f);
    }void test(Form1 f)
    {
         f.Show();
    }是否这样的代码弄呢?我这样试过。不行啊。他说什么错误
    1 “test”的重载均与委托“System.Threading.ThreadStart”不匹配
      

  14.   


    就是去掉Show之前就的行。就是一个普普通通的Show。就什么事都有。我就觉得奇怪。
      

  15.   


    把f的构造和show都放到test中,test就不要参数了
      

  16.   


    恩,终于找到这个源码可以解决我这个问题了。就是要再一个Application.Run(新窗体类);不过这个Application.Run();得新建另一个线程去执行再才可以。感谢您啦,大哥。