1

C# では、次のようなことができます。

OpenFileDialog dlg = new OpenFileDialog();
  if (dlg.ShowDialog() == DialogResult.OK)
  {
    pbxPhoto.Image = new Bitmap(dlg.OpenFile());
  }

しかし、リスナーなしでどのボタンが押されたかを知ることができるのはなぜでしょうか? ファイルを開くダイアログが閉じられるまで、プログラムフローは「if」句の直前で停止しますか?

4

3 に答える 3

2

クラスのShowDialog()メソッドはOpenFileDialog、ボタン クリック イベントを内部的に処理し、DialogResultどのボタンが押されたかを示す戻り値の型を返します。(そうです、メソッドは同期的に呼び出されるため、呼び出し元のメソッドのフローはダイアログが戻るまで停止します。)

独自のモーダル ダイアログ クラス (またはユーザー コントロール) を記述する場合、この動作を模倣できます。この場合、ボタン クリック イベントをダイアログ クラス内で内部的に処理し、結果として列挙を提供して、ダイアログの内部動作をカプセル化します。

別の方法として、独自のハンドラーをFileOkイベントに追加することもできますが、Show()ジャスティンの回答によると、これはおそらく非モーダルを使用する方が理にかなっています。

于 2012-08-15T10:17:44.863 に答える
1

答えはイエスだと思います。ShoweDialog 呼び出しは、モーダル ダイアログが閉じられるまでブロックされます。別の (つまり非モーダルな) 動作が必要な場合は、代わりに Show() を呼び出す必要があります。

于 2012-08-15T10:21:24.050 に答える
1

ShowDialog はモーダル フォームです。つまり、アプリケーションが通常の状態に戻る前に閉じる必要があります。ShowDialog メソッドが呼び出されると、ダイアログ ボックスのボタンの 1 つが押された後の状態を含む列挙型が返されます。たとえば、ユーザーが [OK] を押すと、DialogResult が [OK] に設定され、呼び出し元に返されます。呼び出し元は、返された結果 (Enum) から何をすべきかを決定します。

于 2012-08-15T10:28:39.570 に答える