2016-03-18 11 views
0

FindContext内で結果を検出すると、ContentControlOnEnterイベントとContentControlOnExitイベントが発生するように見えます。選択イベントがコンテンツコントロール内にあっても終了イベントが発生するので、特に迷惑なので、アクティブなコンテンツコントロールに応じてボタンの状態を設定するコードはすべて正しくない状態に見えます。MS Word VSTO Addin Find.Executeは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操作の原因となっているので、実際に問題が発生しています。

これらのイベントを引き起こさずにFind.Executeを使用する方法はありますか?それに失敗した場合、Findトリガのものと本物のものを区別する良い方法はありますか?私は入力イベントと終了イベントの間の時間を使用しようとしましたが、これは信頼できません。

答えて

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で同様の問題が発生しましたが、これはSelectionイベントに関するものです。私は多くのソリューションを試しましたが、1つだけが助けました。あなたのケースでは、 finder.Execute("test)falseを呼び出す前に新しいフィールドbool _skipEnterAndExitEventsを設定してtrueに設定してください。また、入力および終了イベントハンドラでこのフィールドをチェックし、フィールドが真であればスキップします。このソリューションは美しいものではなく、ハックのように見えますが、他のソリューションはさらに醜いものであり、実際には機能しません。

私はまともな解決策見つけたと思う
+0

をFind.Executeが終了した後にenterイベントが発生することがあるので、イベントハンドラのコードが実行されるまでにboolフラグがfalseになることがあります。私はそれをショットを与えるだろう! – Zout

関連する問題