0

というフォームがMyFormあり、プログラムの実行中に、クラス自体の外からそのプロパティを編集したいと考えています。

これが私が得たものです:

static void Main()
{
    MyForm main = new MyForm();
    main.ShowDialog();
    main.Text = "Hello";
}

ただし、ShowDialog()フォームを閉じるまでプログラムをフリーズしているように見えるため、フォームmain.Text = "Hello";を閉じるまで実行されません。

私も使用してみmain.Show()ましたが、関数内のすべてのコードを実行した後にフォームを閉じるだけMain()なので、テキスト"Hello"はすばやく点滅します。

フォームを常に開いて、プログラムの実行中にクラス自体の外からコントロールを変更できるようにするために必要です。

どうすればこれを達成できますか?別のスレッドなどでフォームを実行する必要がありますか?

4

2 に答える 2

3

ここには複数の質問があります。一度に 1 つに集中するようにしてください。質問をハイライトさせてください。

  1. Main の終了時にプログラムが終了するのはなぜですか?
  2. フォームを表示するときにプログラムが「フリーズ」しないようにするにはどうすればよいですか?
  3. 他の場所からフォームのコンテンツにアクセスするにはどうすればよいですか?

答え:

  1. それが、プログラムの存続期間の設計です。メイン スレッド (Main メソッドを実行) が終了すると、プログラムは終了します。その過程で、開いているフォームはすべて閉じられます。Application.Run(main);解決策は、通常、フォームを表示し、フォームが閉じるのを待つことによって、メインが終了できないようにすることです。
  2. Showと ではなくを使用しShowDialogますが、プログラムを開いたままにしておく他のフォームがないため、プログラムは閉じます。Show は、フォームを表示した後に戻り、プログラムが行っていたことに戻ります。あなたの場合、プログラムは何もすることがないので、終了します。
  3. プログラムの残りの部分がアクセスできる場所にフォームへの参照を保存する必要があります。静的フィールド/プロパティをどこかで使用するか、フォームを必要とするさまざまな部分にフォームを渡すことができます。
于 2013-03-23T12:57:17.397 に答える
1

まず、あなたの特定のシナリオが何であるかわかりません。おそらく私の解決策はあなたにとって良いかもしれませんが、そうでない場合は、何を達成しようとしているのか正確に教えてください.

static void Main()
{
    var main = new MyForm();
    //Initialize a new thread with the `DoSomething()` method
    //and pass the form as a parameter
    var thread = new Thread(() => DoSomething(main)) {IsBackground = true};
    thread.Start();
    main.ShowDialog();
}

static void DoSomething(MyForm main) {
    //Update the form title
    main.Text = "Hello";
    //Wait one second
    Thread.Sleep(1000);
    //Update the form title again
    main.Text = "World";
}
于 2013-03-23T13:10:44.693 に答える