2016-03-18 75 views
0

看来,如果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而不会触发这些事件吗?否则,是否有区分查找触发式和真正用户之间的好方法?我试图使用进入和退出事件之间的时间,但这不可靠。

回答

0

我想我找到了一个体面的解决方案:

private bool _doIgnoreNextExit = false; 

private void ActiveDocument_ContentControlOnEnter(Word.ContentControl ContentControl) 
{ 
    if (Application.Selection.Find.Found) 
    { 
     _logger.Debug("Ignoring CC enter event caused by Find operation"); 
     _doIgnoreNextExit = true; 
     return; 
    } 
    // Do things 
} 

private void ActiveDocument_ContentControlOnExit(Word.ContentControl ContentControl) 
{ 
    if(_doIgnoreNextExit) 
    { 
     _logger.Debug("Ignoring fake exit"); 
     _doIgnoreNextExit = false; 
     return; 
    } 
    // Do things 
} 
0

我在Word中有类似的问题,虽然它是关于选择事件。我尝试了很多解决方案,但只有一个帮助。在你的情况下,在拨打 finder.Execute("test)false后,拨打一个新字段bool _skipEnterAndExitEvents并将其设置为true。在进入和退出事件处理程序中检查该字段,如果该字段为真,则跳过。这种解决方案并不美观,看起来像是黑客,但其他解决方案甚至更加丑陋,实际上并不奏效。

+0

嗯..我试过类似(除了在执行操作前手动删除事件处理程序,并经过重新添加它们)的东西,但它似乎偶尔会在Find.Execute结束后触发enter事件,所以在这种情况下,布尔标志在事件处理程序中的代码运行时为false。不过,我会尽力的! – Zout