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 回答