Ms word MS Word VSTO加载项查找。执行激发ContentControlOnCenter事件

Ms word MS Word VSTO加载项查找。执行激发ContentControlOnCenter事件,ms-word,find,ms-office,vsto,Ms Word,Find,Ms Office,Vsto,似乎,如果Find.Execute在ContentControl中找到一个结果,它将引发ContentControlOneNet和ContentControlOnExit事件。这尤其令人恼火,因为即使选择仍在内容控件中,退出事件也会激发,因此任何设置依赖于活动内容控件的按钮状态的代码都将显示为处于错误状态 给定一个文档,其中包含一个带有单词“test”的内容控件,以及以下代码: // In setup Application.ActiveDocument.ContentControlOnEnte

似乎,如果Find.Execute在ContentControl中找到一个结果,它将引发ContentControlOneNet和ContentControlOnExit事件。这尤其令人恼火,因为即使选择仍在内容控件中,退出事件也会激发,因此任何设置依赖于活动内容控件的按钮状态的代码都将显示为处于错误状态

给定一个文档,其中包含一个带有单词“test”的内容控件,以及以下代码:

// 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
我们有很多处理ContentControlOneNet和ContentControlOnExit事件的代码,让find操作调用它们确实会造成问题


有没有办法使用Find.Execute而不让它触发这些事件?如果做不到这一点,有没有一种好的方法来区分Find触发的和真正的用户触发的?我曾尝试使用进入和退出事件之间的时间,但这并不可靠。

我在Word中遇到了类似的问题,尽管它与选择事件有关。我尝试了许多解决方案,但只有一个有效。在您的情况下,在调用


finder.Execute(“test”)
false
调用后执行。在输入和退出事件处理程序中检查此字段,如果该字段为true,则跳过。此解决方案不美观,看起来像黑客,但其他解决方案更难看,实际上不起作用。

我认为我找到了一个不错的解决方案:

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
}

嗯……我也尝试过类似的方法(以及在执行操作之前手动删除事件处理程序,然后重新添加它们)但似乎偶尔会在Find.Execute结束后触发enter事件,因此在这种情况下,当事件处理程序中的代码运行时,bool标志将为false。不过,我会尝试一下!