C# - 如何对另一个 class 中引发的事件作出反应?
C# - How to react on an Event raised in another class?
我有 2 个类:
一个创建 FileSystemWatcher 的服务,当被监视的文件被 Word 保存时,它会触发一个事件。
还有一个 UserControl,它具有一些我需要在触发 SaveEvent 时执行的功能。
如何响应 UserControl 中的 SaveEvent?
为该事件创建一个委托来处理它。
myClass.SaveEvent += DelegateMethod();
public void DelegateMethod(object sender, SaveEventArgs e)
{
//do stuff
//run your handler code
}
我将在服务中创建一个事件,该事件将在引发 FileSystemWatcher 时引发。 服务应该包装 FileSystemWatcher。两个对象的父对象将调用 UserControl 上的方法。
例如:(伪)
class MyProgram
{
Service svc;
UserControl ctrl;
public MyProgram()
{
// create the control
ctrl = new UserControl();
// create the service
svc = new Service();
svc.SaveEvent += FileChanges;
/////// you might construct something like: _(do not use both)_
svc.SaveEvent += (s, e) => ctrl.FileIsSaved(e.Filename);
}
private void FileChanges(object sender, ServiceFileChangedEventArgs e)
{
ctrl.FileIsSaved(e.Filename);
}
}
class Service
{
// FileSystemWatcher
private FileSystemWatcher _watcher;
public Service() // constructor
{
// construct it.
_watcher = new FileSystemWatcher();
_watcher.Changed += Watcher_Changed;
}
// when the file system watcher raises an event, you could pass it thru or construct a new one, whatever you need to pass to the parent object
private void Watcher_Changed(object source, FileSystemEventArgs e)
{
SaveEvent?.Invoke(this, new ServiceFileChangedEventArgs(e.FullPath)); // whatever
}
public event EventHandler<SaveEventEventArgs> SaveEvent;
}
class SaveEventEventArgs : EventArgs
{
// filename etc....
}
这只是一些伪示例代码。但重要的是,您的 Program
/Usercontrol
应该 而不是 取决于 FileSystemWatcher
。你的 Service
应该把它包起来。因此,无论何时您决定将 FileSystemWatcher
更改为(例如)DropBoxWatcher
,程序的其余部分都不会被破坏。
我有 2 个类:
一个创建 FileSystemWatcher 的服务,当被监视的文件被 Word 保存时,它会触发一个事件。 还有一个 UserControl,它具有一些我需要在触发 SaveEvent 时执行的功能。
如何响应 UserControl 中的 SaveEvent?
为该事件创建一个委托来处理它。
myClass.SaveEvent += DelegateMethod();
public void DelegateMethod(object sender, SaveEventArgs e)
{
//do stuff
//run your handler code
}
我将在服务中创建一个事件,该事件将在引发 FileSystemWatcher 时引发。 服务应该包装 FileSystemWatcher。两个对象的父对象将调用 UserControl 上的方法。
例如:(伪)
class MyProgram
{
Service svc;
UserControl ctrl;
public MyProgram()
{
// create the control
ctrl = new UserControl();
// create the service
svc = new Service();
svc.SaveEvent += FileChanges;
/////// you might construct something like: _(do not use both)_
svc.SaveEvent += (s, e) => ctrl.FileIsSaved(e.Filename);
}
private void FileChanges(object sender, ServiceFileChangedEventArgs e)
{
ctrl.FileIsSaved(e.Filename);
}
}
class Service
{
// FileSystemWatcher
private FileSystemWatcher _watcher;
public Service() // constructor
{
// construct it.
_watcher = new FileSystemWatcher();
_watcher.Changed += Watcher_Changed;
}
// when the file system watcher raises an event, you could pass it thru or construct a new one, whatever you need to pass to the parent object
private void Watcher_Changed(object source, FileSystemEventArgs e)
{
SaveEvent?.Invoke(this, new ServiceFileChangedEventArgs(e.FullPath)); // whatever
}
public event EventHandler<SaveEventEventArgs> SaveEvent;
}
class SaveEventEventArgs : EventArgs
{
// filename etc....
}
这只是一些伪示例代码。但重要的是,您的 Program
/Usercontrol
应该 而不是 取决于 FileSystemWatcher
。你的 Service
应该把它包起来。因此,无论何时您决定将 FileSystemWatcher
更改为(例如)DropBoxWatcher
,程序的其余部分都不会被破坏。