看来,如果Find.Execute在ContentControl中查找到结果,它将导致ContentControlOnEnter和ContentControlOnExit事件触发。这尤其令人讨厌,因为即使选择仍然在内容控件中,退出事件也会触发,因此任何设置依赖内容控件激活的按钮状态的代码都将显示为不正确的状态。MS Word VSTO Addin Find.Execute fires ContentControlOnEnter事件
给出一个包含字“测试”,单个内容的控制文件和下面的代码:
// In setup
Application.ActiveDocument.ContentControlOnEnter += ActiveDocument_ContentControlOnEnter;
private void ActiveDocument_ContentControlOnEnter(Word.ContentControl ContentControl)
{
var selRange = _Application.Selection.Range;
_logger.Debug(m => m("Selection: {0}-{1}", selRange.Start, selRange.End));
}
//Later in another method
var finder = _Application.ActiveDocument.Range().Find;
_logger.Debug("Find.Execute start");
finder.Execute("test);
_logger.Debug("Find.Execute end");
下得到记录:
38137 [VSTA_Main] DEBUG - Find.Execute start
38141 [VSTA_Main] DEBUG - Selection: 1-5
38149 [VSTA_Main] DEBUG - Find.Execute end
我们有很多的代码,处理ContentControlOnEnter和ContentControlOnExit事件,并使查找操作导致它们被调用真的造成问题!
有什么方法可以使用Find.Execute而不会触发这些事件吗?否则,是否有区分查找触发式和真正用户之间的好方法?我试图使用进入和退出事件之间的时间,但这不可靠。
嗯..我试过类似(除了在执行操作前手动删除事件处理程序,并经过重新添加它们)的东西,但它似乎偶尔会在Find.Execute结束后触发enter事件,所以在这种情况下,布尔标志在事件处理程序中的代码运行时为false。不过,我会尽力的! – Zout