2011-11-25 64 views
1

我開始了一個小應用程序(C#,.Net4,控制檯應用程序),這是基於規則在家中移動文件的基本想法。從方法返回更新

這個應用程序已經發展並變得非常有用。所以我的任務是將其分解成更多可重用的類和更小的項目(類庫)。

我有一個通用的'顯示'函數,它接受一個字符串和一個error_level id。基於此,我會以某種顏色將文本輸出到我的控制檯窗口。當一切都在一個大類中時,一切都很好,但我想將一個方法移到它自己的類libabry中 - 但是,我希望它在處理過程中向我的UI(控制檯窗口,現在)報告更新。當我將它移動到課堂上時,顯然,按照我的'顯示'方法'課程,休息。

有沒有一種方法可以讓我的類方法發送的消息回到我的UI?它的信息如'打開配置文件','處理12個新文件','成功'。

恰巧,UI獲取消息並顯示它們,而方法完成它的工作。

目前,它是一個控制檯應用程序項目。我的計劃是撕掉工作代碼,保留控制檯應用程序進行測試,然後將「UI」更改爲一個不錯的WPF桌面應用程序。 (我試圖學習WPF,並決定使用一個我很久以前開始的小項目,並且'皮膚')。

回答

2

我建議你添加一個接口,在你的UI中實現這個接口,並且傳遞一個對實現新類接口的類的引用。

如果您在單個線程或多個線程中執行工作,則此方法應該可行。

例如,接口:

public interface INotify 
{ 
    void Notify(string Msg); 
} 

的UI:

public class Form1 : INotify 
{ 
     // This is the method where you instantiate the new worker process 
     public void DoSomeWork() { 
      NewClass Worker = New NewClass(this); 
     } 

     public delegate void NotifyDelegate(string Msg); 

    public void Notify(string Msg) 
    { 
     txtLog.Text += Msg + Environment.NewLine; 
    } 

    void INotify.Notify(string Msg) 
    { 
     this.INotify_Notify(Msg); 
    } 
    private void INotify_Notify(string Msg) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new NotifyDelegate(Notify), Msg); 
     } 
     else 
     { 
      this.Notify(Msg); 
     } 
    } 
    } 

和新類(只需要調用這個類通知發送消息):

public class NewClass 
{ 
    private INotify m_Notifier; 

    private void Notify(string Msg) 
    { 
     m_Notifier.Notify(Msg); 
    } 

    public NewClass(INotify oNotifier) 
    { 
     m_Notifier = oNotifier; 
    } 
} 

更新替代實施

與靜態類一起工作的替代實現是實現委託。

例如,這裏是委託:

public delegate void NotifyDelegate(string Msg); 

下面是控制檯應用程序的示例靜態類:

static class Program 
{ 
    private static NotifyDelegate m_Notifier; 
    static void Main(string[] args) 
    { 
     m_Notifier = new NotifyDelegate(Notify); 

     NewClass oNewClass = new NewClass(m_Notifier); 

     // Your work code here 
    } 
    static void Notify(string Msg) 
    { 
     Console.WriteLine(Msg); 
    } 
} 

和工作類的修訂版:

public class NewClass 
{ 
    private NotifyDelegate m_Notifier; 

    public void Notify(string Msg) 
    { 
     m_Notifier.Invoke(Msg); 
    } 

    public NewClass(NotifyDelegate oNotifier) 
    { 
     m_Notifier = oNotifier; 
    } 
} 
+0

謝謝,我正在嘗試 - 但是,我的應用程序目前是一個控制檯應用程序,所以我的主要程序類是靜態的。當我聲明我的Notify方法時,它必須在我的程序中是靜態的。 public static void Notify(string message,Constants.ErrorLevel errorLevel) 。接口聲明如下:void Notify(string message,Constants.ErrorLevel errorLevel);所以,因爲一個是靜態的,另一個是沒有的,所以我在我的用戶界面上發現錯誤,說Notify沒有實現。我該如何解決這個問題? – Craig

+0

我已經更新了使用委託而不是界面來處理您的情況的答案。 –

+0

感謝你 - 因爲我正在走向一個非靜態類,當我得到WPF時,最好是使用基於接口的解決方案,還是事件處理程序適合靜態和非靜態項目? – Craig

1

那麼這通常是用Binding完成的,你將viewModel與view綁定在一起,而viewModel的任何修改都會直接顯示在你的UI中。

2

如果我正確理解你的問題,我會實現事件處理,以便你的UI可以訂閱某種狀態event。 另一種方法是使用某種記錄框架(如NLog)並通過methodCall target登錄到UI中的靜態方法。 由於您使用的是WPF,因此使用MVVM會很有意義。這可能是創建功能強大且可維護的用戶界面的最佳方式。

1

能工作的類會引起UI線程中的類正在偵聽的event? 'worker'類會用一些參數引發一個事件,然後監聽器類會將這些信息寫入UI。