2017-09-01 8 views
0

特定のプログラム(Autodesk Revit)用のアドインを作成しています。 このアドインの中で、私はユーザーにWinFormを表示しています。 winformのボタンを使用すると、ユーザーは一時的にメインアプリケーション(Autodesk Revit)に戻って選択を行い、終了するとWinFormに返送されます。ShowDialogの代わりにShowを使用している間にC#フリーズプロセス

Winフォームを初期化するとき、私は使用することができますいずれかForm.Show()か、私は、ユーザーが選択を行うようにするフォームが適切な表示、フォーム上のボタンを使用することができますForm.Show()を使用して希望の場合Form.ShowDialog()

を使用選択の前にthis.hide()を使用して選択が完了し、選択プロセスの間にフォームを一時的に非表示にした後にthis.Show()を使用してフォームに戻ることができます。

私はForm.ShowDialog()を使用しています。フォームが適切に表示され、フォーム上のボタンを使用できますが、ダイアログの結果を待つ間にShowDialogがメインアプリケーションをフリーズするため、ユーザーは選択できません。

だから私はForm.ShowDialog()の代わりにForm.Show()と一緒に行きたいと思っています。

私がForm.Show()を使用している場合、フォームはバックグラウンドまたは別のモニタに移動できます。メインアプリケーションはフリーズ状態ではないため、そのまま作業を続けることができますフォームがまだ開いていることを完全に忘れる。

実際にShowを使用しているときに、私がShowDialogを使用しているかのように、何らかの理由でメインアプリケーションをアイドリング/フリーズすることが可能かどうか疑問に思っていますか?別のスレッドを使用して

答えて

0

以下のコードを使用しShowDialogue()を使用しているとき、あなたのメインフォームをハングアップしません。

 //Initially 
     this.Enabled = false; 
     Form form = new YourForm(); 
     form.TopMost = true; 
     form.Focus(); 
     System.Threading.Thread thread = new System.Threading.Thread(() => form.ShowDialog()); 
     thread.Priority = System.Threading.ThreadPriority.Highest; //<- just an example, set it according to your need 
     thread.Start(); 



     //If you want to close it from the main form (you can do it from the opened form itself though) 
     form.Invoke((MethodInvoker)delegate 
     { 
      form.Close(); 
     }); 
     thread.Abort(); 
     this.TopMost = true; 
     this.Enabled = true; 
     this.Focus(); 
     this.TopMost = false; 
+0

でも、ユーザーはWinformを最小化または閉じることができ、元のアプリケーションで作業を続けることができます。 –

+0

もう一方のフォームを解体できないようにしますか? –

+0

メインアプリケーションは基本的にホストで、メインアプリケーションが終了すると私のフォームは存在しません。だから私は(showdialogを使用するときに起こるように)メインをフリーズしたい。実際には.showを使用してコードでフリーズしたい。 – Dante1986

2

を私はあなたのロジックビットを調整する必要があると思う:

  • 使用ShowDialogが、フォームを閉じて元のアプリケーションに戻します。
  • 閉じる前にフォームの状態を保存する方法(例えば、MemoryStreamにシリアライズする)を考えてください。
  • フォームを再作成し、フォームを再度表示する前にその状態を復元してから、再度ユーザーにフォームを送信してもらいます。
+0

@Sam:はい、ばかげた間違い:) –

+0

これは実際に私が考えていた回避策でした。選択コマンドを呼び出したときにクローズを呼び出すだけで、ユーザーの選択が完了すると、フォームの新しいインスタンスが開始され、アプリケーションの現在の選択状態が取得されます。その場合、私はShowDialog()を使用することができますが、それは解決策としてのソリッドな解決策として感じています。 – Dante1986

+0

回避策として、アプリケーションのアーキテクチャーコンセプトとしてもっと考えていません。 –

関連する問題