1

我遇到了一个对我来说很奇怪的问题,但希望对其他人来说并不那么奇怪。:) 一些背景知识:我正在开发一个简单的 IM 客户端,它允许用户向多个收件人广播消息。目标是为每个接收者创建一个包含广播消息文本的聊天表单,然后仅当接收者响应广播者时才显示该表单。但是,当应用程序收到响应然后尝试定位该特定聊天会话的表单(使用 Application.OpenForms)时,它找不到它,除非在创建它时使用 .Show。我想避免在创建此表单时显示它,因为这意味着用户将在屏幕上看到一个闪光。表格好像不是真的在我展示它之前创建它,但似乎必须有一种方法可以在不先展示的情况下做到这一点。有人可以帮忙吗?

如果需要,我可以提供代码片段,但我没有在这篇文章中提供,因为这感觉更像是我的概念上的误解,而不是代码中的错误。提前致谢!

4

4 回答 4

2

不要将表单用作基类,而是以另一种方式进行,创建一个可以引用表单的类。这样,您将让班级了解内容,并将其反映在表单上(如果已初始化),而不是相反。您不应该依赖表单作为对象的基础。使用 Application.OpenForms应该是不必要的。

public class Contact
{
    string displayname = String.Empty;
    List<Message> history = new List<Message>();
    MessageForm theform = new MessageForm(this);

    public void OnEvent(Message msg)
    {
        if(msg.Sender != me && !theform.Visible)
            theform.Show();

    }

    public void Tell(string message)
    {
    }

}

ETC

将您的联系人保存在某种列表中,事情应该相对简单。(请注意,Windows 窗体不是线程安全的,如果您尝试从与主线程不同的线程更改任何控件的任何属性,则会引发异常)

于 2010-05-04T14:39:45.040 回答
0

windows 窗体具有 Hide()、Show() 和 Activate() 等方法。使用这些方法解决您的问题。

于 2010-05-04T14:21:33.960 回答
0

为什么不使用聊天会话存储对表单的引用,并.Show()在需要显示表单时使用它来调用:

session.form.Show();

然后,您可以创建表单而不显示它,并且Application.OpenForms每次要引用它时都没有调用的开销。

我知道这是显而易见的,但OpenForms找不到未显示的表格,因为它没有打开。

于 2010-05-04T14:24:00.627 回答
0

由于在显示表单之前不会创建表单句柄,您可以像这样手动分配它:

mf = new MainForm();

        /* Need to assign a handle to MainForm instance manually
         as handle does not get created until form is shown */
        IntPtr handle = mf.Handle; 
于 2010-05-04T14:26:26.273 回答