MS Word VSTO Addin Find.Execute触发ContentControlOnEnter事件

时间:2016-03-18 22:20:46

标签: ms-word find ms-office vsto

似乎如果Find.Execute在ContentControl中找到结果,它将导致触发ContentControlOnEnter和ContentControlOnExit事件。这特别令人讨厌,因为即使选择仍在内容控件中,exit事件也会触发,因此任何设置依赖于内容控件处于活动状态的按钮状态的代码都将显示为错误状态。

给定一个包含单个内容控件的文档,其中包含单词“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

我们有很多处理ContentControlOnEnter和ContentControlOnExit事件的代码,并且让find操作导致它们被调用真的会导致问题!

有没有办法使用Find.Execute而不触发这些事件?如果不这样做,是否有一种很好的方法可以区分查找触发的和真正的用户?我尝试过使用enter和exit事件之间的时间,但这不可靠。

2 个答案:

答案 0 :(得分:0)

我在Word中遇到了类似的问题,但它是关于Selection事件的。我尝试了很多解决方案,但只有一个有帮助。在您的情况下,请在调用rbool _skipEnterAndExitEvents之后创建一个新字段true并将其设置为 finder.Execute("test)。并且在enter和exit事件处理程序中检查此字段,如果该字段为true,则只需跳过。这个解决方案不漂亮,看起来像黑客,但其他解决方案甚至更加丑陋,并没有真正发挥作用。

答案 1 :(得分: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
}