4

私は、特定の状態をユーザーに警告するフォームを作成するコンソールアプリケーションに取り組んでいます。後の段階で、コードベースはクラスライブラリになります。

ただし、今のところ、フォームを表示する必要があります(ここでは、ShowDialogが最適なメソッドだと思います)。次に、フォームを閉じる前に任意のメソッドを呼び出します。

例として、フォームを表示し、ラベルコントロールのテキスト値を設定し、n秒間待ってから、ラベルの値を変更してから、フォームを閉じる必要があります。これは少し些細なことのように聞こえますが、私は設計の概念実証を試みています。

調べてみましたが、ShowDialog()では、呼び出し元のメソッド/クラスのコードリストを続行する前にフォームを閉じる必要があるため、これが可能ではないようです。

これが私がこれまでに持っているものです:

PopUpForm myForm = new PopUpForm(string messageToDisplay);
myForm.ShowDialog();
//call myForm.someMethod() here, before the form closes
//dispose of the form, now that we've no use for it
myform.Dispose();

//target method in PopUpform class
public void someMethod()
{
  lblText.Text = "Waiting for some reason";
  //wait n number of seconds
  lblText.Text = "Finished waiting. Form will now close";
  //it doesn't matter if the form closes before the user can see this.
}

ShowDialog()はこの種の動作をサポートしていないようです。私はBackgroundWorkerスレッドを調べていますが、誰かがこれについて何かアドバイスがあるか、または以前にこれに遭遇したことがあるかどうか疑問に思っていました。

4

3 に答える 3

5

フォームを表示したい場合は、作業を続行してから閉じてください。次Form.Show()の代わりに、を介して行うことができますForm.ShowDialog()

using (var myForm = new PopUpForm(messageToDisplay))
{
    myForm.Show(); // Show the form

    DoWork(); // Do your work...

    myForm.Close(); // Close it when you're done...
} 

ただし、これが純粋にコンソールアプリケーションである場合(およびメッセージポンプがない場合)、これは正しく機能しない可能性があります。

他のオプションは、タイマーを提供しFormて閉じるか、デリゲートをフォームに渡してShowでメソッドを実行し、その後、それ自体を閉じることです。

後の段階で、コードベースはクラスライブラリになります。

これを行うときは、通知を提供するための別のメカニズムを考え出す必要があります。ライブラリを特定のUIテクノロジーに結合することは悪い考えです。ライブラリにイベントやその他の通知を提供するだけで、ユーザーがUI/通知をユーザーに提供できるようにする方がよいでしょう。

于 2013-03-06T16:48:24.640 に答える
3

このコードが最終的にコードライブラリに含まれることを目的としている場合は、独自の意志でフォームを表示することはお勧めしません。ライブラリは、フォームを表示できるようにするために、呼び出し元のアプリケーションがキャッチできるイベント、または場合によっては例外を生成する必要があります。ユーザーへの表示が必要な特定の詳細がライブラリーの内部にある場合は、ライブラリーからDisplayEventData()メソッドを公開します。

于 2013-03-06T16:48:18.530 に答える
2

-ShowDialogメソッドは「モーダル」ウィンドウを作成し、通常は閉じるまで([OK]または[キャンセル]をクリックして)UIをブロックします。WinFormを自分で作成する必要がありますが、単純なものにして、メッセージポンプを作成することもできます。あなたは呼び出すことによってあなた自身のフォームを実行することができます

Application.Run(YourForm);

たとえば、フォームが開いている間、コンソールスレッドが続行されないようにするには、コンソールスレッドをミューテックスで保持する必要があります。Closeこのフォームは、コンソールスレッドに続行するように指示できるなどのWinFormsから知っているすべてのメソッドを提供します。

これはMSDNで参照してください。

于 2013-03-06T16:48:56.570 に答える