0

別のクラスから Windows フォームのオブジェクトを制御する最良の方法を探しています。あなたの答えが「これは OOP 言語で行う方法ではありません!」という場合は、回答しないでください。Plsは私が必要なものを世話します:

Windows フォームに非表示のプログレス バーがあります。Windows フォームのボタンを押すと、ファイルが読み込まれ、進行状況バーがいくつかの手順を実行するはずです...ファイルの読み込み操作はかなり複雑なので、特定の種類のファイル用の独自のクラスから読み込みます. お気に入り:

void TestButton_Click(object sender, EventArgs e)
{
MapFiles.ProcessFile()
}

ProcessFile メソッドで、フォームの ProgressBar を制御したいと考えています。ProgessBar を公開して静的にすると、機能します。しかし、これにはいくつかの不満があります。フォーム デザイナで要素を制御することはできなくなりました。

フォームのインスタンス化されたオブジェクトにアクセスできれば簡単です。しかし、フォームが次のように初期化されているため、方法がわかりません。

Application.Run(new Form1());

MapFiles は実際には Form1 とは何の関係もないので、ここで Inheritance で何かをしたくありませんでした...

別のクラスからこの ProgressBar を制御する別の/最良の方法はありますか?

4

4 に答える 4

1

プログレスバーへの参照をProcessFileメソッドに渡してみませんか。

MapFiles.ProcessFile(progressBar1);

次に、クラスからアクセスできます。次に例を示します。

ProcessFile(ProgressBar progressBar1)
{
    progressBar1.Value = 0;
}

注: あなたが言ったように、これはおそらく最善の方法ではありません。しかし、あなたはあなたの特定の要件を明確にしたので、これはあなたのクラスが進行状況バーを制御できるようにするための私の提案です

于 2013-10-04T15:23:37.863 に答える
0

フォームへの参照を渡したくない場合は、このようなものを作成できます。

public static class FormSharer
{
   public static YourFormClass Form {get; set;}
}

あなたのフォームロードイベントで

FormSharer.Form = this;

他のすべてのクラスから FormSharer.Form を参照するだけです

そうは言っても、これを行うのはあまり良い考えではありません。しかし、もう一度それが必要なので、それだけです。

于 2013-10-04T15:31:44.847 に答える
0

クラスを使用して、Progressこれを非常に効果的に処理できます。

Progress進行状況を更新する方法を示すオブジェクトをクリック ハンドラーで定義することから始めてください。この場合、プログレス バーの値を更新します。

次に、そのProgressインスタンス*as anIProgress` instance* をワーカーに渡します。

その後、ワーカーは を使用Reportして進行状況を示すことができます。

private void button1_Click(object sender, EventArgs e)
{
    Progress<int> progress = new Progress<int>(
        percent => progressbar1.Value = percent);
    DoStuff(progress);
}

private void DoStuff(IProgress<int> progress)
{
    Task.Run(() =>
    {
        for (int i = 0; i < 100; i++)
        {
            progress.Report(i);
            Thread.Sleep(200); //placeholder for real work
        }
    });
}

何よりも、Progressクラスは現在をキャプチャし、進行状況の変更イベントを呼び出すときにそれを使用するため、他のスレッドからSynchronizationContext呼び出した場合でも、UI スレッドでイベントを発生させることができます。Report

于 2013-10-04T16:37:44.087 に答える