我遇到的问题对我来说很奇怪,但希望对其他人来说并不那么奇怪。 :)一些背景:我正在开发一个简单的IM客户端,允许用户向多个收件人广播消息。目标是为包含广播消息文本的每个收件人创建聊天表单,然后仅在收件人响应广播者时显示该表单。但是,当应用程序收到响应然后尝试找到该特定聊天会话的表单(使用Application.OpenForms)时,它无法找到它,除非我在创建它时显示。我想避免在创建时显示此表单,因为这意味着用户将在屏幕上看到闪存。在我显示之前,表单似乎不会真正创建,但似乎必须有一种方法可以在不首先显示的情况下执行此操作。有人可以帮忙吗?
如果需要,我可以提供代码片段,我没有在这篇文章中,因为这对我来说更像是一个概念上的误解而不是代码中的错误。提前谢谢!
答案 0 :(得分:2)
不是将表单用作基类,而是以其他方式执行,创建可以引用表单的类。这样,你就可以让班级了解内容,并将其反映在表格上(如果已经初始化),而不是反过来。 您不应该依赖Forms作为对象的基础。使用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)
{
}
}
等
将您的联系人保留在某种列表中,事情应该相对简单。 (请注意,Windows窗体不是线程安全的,如果您尝试更改来自与main不同的线程的任何控件的任何属性,则会抛出异常)
答案 1 :(得分:0)
windows窗体有Hide(),Show()和Activate()等方法。使用这些方法来解决您的问题。
答案 2 :(得分:0)
为什么不在聊天会话中存储对表单的引用,并在需要显示表单时使用该引用来调用.Show()
:
session.form.Show();
然后,您可以在不显示表单的情况下创建表单,并且每次要引用它时都没有调用Application.OpenForms
的开销。
我知道这是显而易见的,但是OpenForms
找不到一张未显示的表格,因为它没有打开。
答案 3 :(得分: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;