2011-11-25 68 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。