很多時候,我想通過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,獲得這些對象之後,幾乎可以做任何事情了。