2012-12-19 18 views
4

我有一個WPF/C#程序與幾個類,MainWindow.cs類有用戶控件,我想用其他類中發生的計算狀態更新。在搜索並借用示例之後,我想出瞭如何在其他類中設置Event,並在發生某些變化時調用它。然後,只要主類有一個處理程序綁定該事件,我可以適當地更新UI的東西(狀態欄等)。下面是我在做什麼的精簡版本:是否可以引用其他類的MainWindow.cs?

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) 
    } 


} 
} 
  • 請問有沒有辦法簡單地調用來自其他類的進度財產? (即MainWindow.progressBar.Value)?
  • 當我調用事件時,「object sender」參數的用途是什麼,它應該如何正常使用?我看到的例子總是使用'​​null'。

謝謝!

回答

2

1)是的,如果聲明爲public,則可以訪問任何類的任何部分。在這種情況下,您可以將progressBar控件聲明爲public,並且引用class MainWindow的任何東西都可以擺弄它。但是,這將是相當不好的做法。相反,你可以綁定到一些與當前活動進度相關的「值」,並讓MainWindow類擔心它如何表示該更改(在這種情況下,通過更新ProgressBar),

2)object sender在所有的事件中都是爲了提到事件的對象,所以事件消費者知道事件來自哪裏。使用null也是國際海事組織不佳的做法,一般而言,引發事件的對象應該這樣做;

SomeEvent(this, someEventArgs); 
+0

謝謝!很有幫助。想知道,你能解釋一下你的意思嗎?你的意思是將進度條綁定到外部類中的值(即TestA類)嗎? – superwillis

+1

如果您正在WPF中開發,也許可以在MVVM體系結構上進行一些閱讀; http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。視圖應該直觀地表示ViewModel的狀態,在這種情況下是計算任務進度的狀態。 –

+0

感謝您的提示。跟隨鏈接,發現另一個更具體的文章,這是非常翔實的。在此處發佈供其他人使用:「使用數據綁定和WPF自定義數據顯示」(http://msdn.microsoft.com/zh-cn/magazine/cc700358.aspx) – superwillis

相關問題