很多时候,我想通过API获取上一次操作有哪些对象被创建、修改或者删除了。或者想监听文档的改变事件,一旦改变发生,程序就做一些特定的事情,例如,把这些改变记录在数据库中,再和其他应用进行交流。
这个时候,就要用到ControlledApplication.DocumentChanged或者Application.DocumentChanged事件了。
这里,我先推荐大家学习一个SDK里面的例子,名字就叫:DocumentChanged,它用来把所有的对文档的修改记录下来,显示在一个表格里面:
接下来我们看怎么使用。
首先,我们需要注册这个事件,通常情况下,会在IExternalApplication里面注册,因为它是ControlledApplication或Application类的事件,如果在IExternalCommand里面注册的话,当Execute函数退出的时候,需要注销这个事件,否则可能造成事件无法管控。
但是在测试环境的时候,我们可以使用IExternalCommand来注册事件,这样比较方便使用AddInManager来加载和调试。
这里我们就以IExternalApplication作为例子:
public class DocChangedRegistryApp : IExternalApplication
{
public Result OnStartup(UIControlledApplication application)
{
//注册事件
application.ControlledApplication.DocumentChanged
+= ControlledApplication_DocumentChanged;
return Result.Succeeded;
}
public Result OnShutdown(UIControlledApplication application)
{
//注销事件
application.ControlledApplication.DocumentChanged
-= ControlledApplication_DocumentChanged;
return Result.Succeeded;
}
void ControlledApplication_DocumentChanged(object sender, DocumentChangedEventArgs e)
{
var doc = e.GetDocument(); //获取对应的文档对象
var added = e.GetAddedElementIds(); //获取增加的对象
var deleted = e.GetDeletedElementIds(); //获取删除的对象
var modified = e.GetModifiedElementIds(); //获取修改的对象
//自己的后续程序
}
}
可以看到,在事件的handler函数里面,我们可以获取对应的Document对象,以及增删改的元素的Id,获得这些对象之后,几乎可以做任何事情了。