2016-03-18 23 views
0

Find.Execute bir ContentControl içinde bir sonuç bulursa, ContentControlOnEnter ve ContentControlOnExit olaylarının tetiklenmesine neden olur. Bu özellikle can sıkıcı bir durumdur çünkü seçim hala içerik kontrolünde olsa bile çıkış olayı patlar, bu nedenle aktif olan bir içerik kontrolüne bağlı olan butonların durumunu ayarlayan herhangi bir kod yanlış durumda görünecektir.MS Word VSTO Eklenti Find.Execute yangınları ContentControlOnEnter olayı

Verilen kelime "test", tek bir içerik kontrolü içeren bir belge ve aşağıdaki kod: Aşağıdaki açmış olur

// 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"); 

: Biz bir sürü kod var

38137 [VSTA_Main] DEBUG - Find.Execute start 
38141 [VSTA_Main] DEBUG - Selection: 1-5 
38149 [VSTA_Main] DEBUG - Find.Execute end 

o ContentControlOnEnter ve ContentControlOnExit olaylarını işler ve bulma işleminin çağrılmasına neden olması gerçekten sorunlara neden olur!

Find.Execute'u bu olayları tetiklemeden kullanmanın bir yolu var mı? Başarısız olan, Find-tetiklenen olanlar ve gerçek kullanıcı olanları ayırt etmek için iyi bir yol var mı? Giriş ve çıkış olayları arasındaki zamanı kullanmayı denedim, ancak bu güvenilir değil.

cevap

0

Ben iyi bir çözüm buldum:

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

Seçim olayıyla ilgili olsa da Word'de benzer sorunlar yaşadım. Birçok çözüm denedim, ancak sadece bir tanesi yardımcı oldu. Durumunuzda, bool _skipEnterAndExitEvents numaralı yeni bir alan oluşturun ve arama yaptıktan sonra finder.Execute("test) ve false'u aramadan önce true'u ayarlayın. Ve giriş ve çıkış olay işleyicilerinde bu alanı kontrol edin, eğer alan doğruysa sadece atlayın. Bu çözümler güzel değil, bir kesmek gibi görünüyor, ama diğer çözümler bile çirkin ve gerçekten işe yaramıyor.

+0

Hmm .. Ben de benzer (yanı sıra manuel işlemi gerçekleştirmeden önce olay işleyicileri kaldırma ve sonra bunları ekleyerek yeniden) bir şey denedim ama görünüyordu Bu durumda, Find.Execute bittikten sonra enter olayı tetiklenecektir, bu durumda, bool bayrağı, olay işleyicilerindeki kodun çalıştığı saat kadar yanlış olacaktır. Yine de bir atış yapacağım! – Zout