1

私には奇妙な問題がありますが、他の誰かにはそれほど奇妙ではないことを願っています。:)いくつかの背景:ユーザーが複数の受信者にメッセージをブロードキャストできるようにする単純なIMクライアントに取り組んでいます。目標は、ブロードキャストメッセージのテキストを含む各受信者用のチャットフォームを作成し、受信者がブロードキャスト担当者に応答した場合にのみそのフォームを表示することです。ただし、アプリケーションが応答を受信すると、その特定のチャットセッションのフォームを(Application.OpenFormsを使用して)検索しようとすると、作成時にI .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)
    {
    }

}

連絡先をある種のリストに入れておけば、物事は比較的単純でなければなりません。(Windowsフォームはスレッドセーフではないことに注意してください。メインとは異なるスレッドからコントロールのプロパティを変更しようとすると、例外がスローされます)

于 2010-05-04T14:39:45.040 に答える
0

Windowsフォームには、Hide()、Show()、Activate()などのメソッドがあります。問題に対してこれらの方法を使用してください。

于 2010-05-04T14:21:33.960 に答える
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 に答える
0

チャットセッションでフォームへの参照を保存し、フォーム.Show()を表示する必要があるときにそれを使用して呼び出してみませんか。

session.form.Show();

その後、フォームを表示せずにフォームを作成でき、Application.OpenForms参照するたびに呼び出すオーバーヘッドがなくなります。

私はこれが明白なことを述べていることを知ってOpenFormsいますが、開いていないために表示されていないフォームは見つかりません。

于 2010-05-04T14:24:00.627 に答える