我正在开发C#VSTO Visio插件。在插件中,当用户在给定文档中选择其他页面时,我想检测并触发页面翻转事件处理程序。我已经看到以下与注册事件有关的线程:
Catch WindowTurnedToPage Event in a Visio AddIn project
复制此逻辑,我已经在ThisAddIn.cs中尝试了以下操作:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Application.ActiveWindow.WindowTurnedToPage += new Visio.EWindow_WindowTurnedToPageEventHandler( Window_WindowTurnedToPage);
}
public void Window_WindowTurnedToPage(Visio.Window Window)
{
Debug.WriteLine(String.Format("Window changed to {0}", Window.Application.ActivePage.Name ));
}
但是,当我尝试将事件处理程序注册为对ThisAddin_Startup的调用的一部分时,我得到了NPE,因为尚未设置“ ActiveWindow”。似乎在注册事件处理程序和正在注册的Document / ActivePage之间存在计时问题。
总之,当加载的文档中的活动页面更改时,我希望Visio Adddin检测并响应用户事件。
将不胜感激。
感谢和问候,安德鲁
我发现注册“打开文档的处理程序”首先会达到我想要的结果。
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
ThisAddIn addin = ThisAddIn.getInstance();
if (addin != null )
{
addin.Application.DocumentOpened += Application_DocumentOpened;
}
}
private void Application_DocumentOpened(Visio.Document doc)
{
if (doc.Application != null)
{
Visio.EApplication_WindowTurnedToPageEventHandler appHandler = new Visio.EApplication_WindowTurnedToPageEventHandler(Application_WindowTurnedToPage);
doc.Application.WindowTurnedToPage += appHandler;
}
}
因此,当打开文档时,将注册转到页面事件处理程序的窗口。但是,我必须使ThisAddIn类成为singelton,才能获取Application实例的句柄以注册文档打开的处理程序。不确定是否有意外的副作用。