4

いくつかのクラスを持つWPF/C#プログラムがあり、MainWindow.csクラスには、他のクラス内で発生する計算のステータスで更新したいユーザーコントロールがあります。グーグルして例を借りた後、他のクラス内でイベントを設定する方法を理解し、何かが変わったときにそれを呼び出す方法を見つけました。次に、メインクラスにそのイベントを関連付けるハンドラーがある限り、UIのもの(ステータスバーなど)を適切に更新できます。以下は、私が行っていることの簡略版です。

    namespace Program
     {
     public partial class MainWindow : Window
     {
          public void SetUpHandler()
          {
               TestA.WorkerProgressThingie += new    ProgressChangedEventHandler(TestA_ProgressChanged);
          }
          void TestA_ProgressChanged(object sender, ProgressChangedEventArgs e)
          {
               progressBar1.Value = e.ProgressPercentage
          }

     }




    public class TestA    
{
    public static event ProgressChangedEventHandler WorkerProgressThingie;

    public static void SomeFunction()
    {   
        int value = 0;         

        //...(some boring code that does something here)

        ProgressChangedEventArgs e = new ProgressChangedEventArgs(value, null);            

        if (WorkerProgressThingie != null)
            WorkerProgressThingie.Invoke(null, e)
    }


}
}
  • 他のクラスからprogressBarプロパティを単純に呼び出す方法はありませんか?(つまり、MainWindow.progressBar.Value)?
  • イベントを呼び出すときの「オブジェクト送信者」パラメーターの目的は何ですか。また、通常はどのように使用されるのでしょうか。私が見る例では、常に「null」を使用しています。

ありがとう!

4

1 に答える 1

2

1)はい、宣言されていれば、どのクラスのどの部分にもアクセスできますpublic。この場合、progressBarコントロールをパブリックとして宣言することができ、への参照があるものはすべてそれをclass MainWindowいじることができます。ただし、これはかなり悪い習慣になります。代わりに、アクティビティの現在の進行状況に関連して更新される「値」にバインドし、MainWindowクラスにその変更をどのように表すか(この場合はProgressBarを更新することによって)を心配させることができます。

2)object senderすべてのイベントで、イベントを発生させたオブジェクトへの参照であることが意図されているため、イベントコンシューマーはイベントがどこから発生したかを知っています。nullを使用することも、IMOの慣例としては不適切であり、一般に、イベントを発生させるオブジェクトは次のようにする必要があります。

SomeEvent(this, someEventArgs);
于 2012-12-19T02:47:45.500 に答える