2017-02-20 7 views
0

Windowsフォームアプリケーションで「ステップバイステップガイド」機能を実装しようとしています。このガイドは、一般的なタスクの実行方法を段階的に説明したものです。私は、ガイドを読んでいる間、ユーザーが指示に従って作業するつもりです。したがって、表示されるウィンドウは、モーダルダイアログが表示されているときににアクセス可能である必要があります。モーダルウィンドウ(.NET Windowsフォーム)とは独立したポップアップウィンドウの作成方法

これは可能ですか?もしそうなら、どうすればいいですか?

+0

それぞれのコントロールを指すツールチップのような意味ですか?はい、これは可能です。問題のウィンドウが所有するウィンドウを作成するだけです。 UIモーダルダイアログは、所有者を無効にするダイアログにすぎず、コードモーダルダイアログは独自のメッセージポンプを実行します。詳しくは、Raymond Chenの一連のダイアログを読んでください。 – andlabs

答えて

0

問題を解決するために必要な情報を教えてくれたandLabs、Tim、IInspectableに感謝します。以下は私が必要とするものです:

Thread myFormThread = new Thread(delegate() 
{ 
    Application.Run(new MyForm()); 
}); 
myFormThread.SetApartmentState(ApartmentState.STA); 
myFormThread.Start(); 

それはうまく動作します。明らかに、メインフォームのイベントハンドラからmyFormのコントロールにアクセスする必要がある場合は、myForm.BeginInvokeを使用するように注意する必要があります。また、フォームへのアクセスを他のウィンドウの背後で失われるように管理するために、ユーザーを支援する必要があります。

0

モーダルが表示されている場合、同じUIスレッドの他のウィンドウと対話することはできません。 C#の同じプロセスで2つの別個のUIスレッドを実行することは可能です(しかしおそらく世界では最善の考えではありません)。しかし、物事を安定させるためには非常に注意する必要があります。メインスレッドで、通常のモーダルフォームを実行します。二次スレッドでは、非モーダルフォームを同時に実行することができます。UIを完了するまで、専用のWindowsメッセージポンプをそのスレッドで実行したままにしてから、メッセージポンプをシャットダウンしてスレッドを終了します。

+0

モダリティは、所有者ウィンドウを無効にすることによって実装されます。スレッドには、モーダルダイアログを所有する1つのウィンドウのみが無効になっているウィンドウがいくつあってもかまいません。システムには何も組み込まれておらず、スレッド上のすべてのウィンドウが無効になります。さらに、複数のUIスレッドを持つことは、クロススレッドウィンドウ階層(所有者/所有者または子/親)をインストールしない限り困難ではありません。 – IInspectable

関連する問題