2016-04-21 20 views
7

Rozszerzenie piszę rozpoczął życie z Instrukcja: Tworzenie przykład Margin glifów dostarczanych przez Microsoft: https://msdn.microsoft.com/en-us/library/ee361745.aspxVisual Studio MEF rozszerzeń - Siła Margin Glyphs zostać zaktualizowane lub Przerysuj

Wszystko działa poprawnie, z wyjątkiem Próbuję wyzwolić przerysowanie lub aktualizację glifów marginesów za każdym razem, gdy dane, których używam, decydują, która linia narysować glif na zmiany.

Zasadniczo mam przycisk w oknie narzędzia, gdy użytkownik kliknie przycisk, chcę, aby glif pojawił się na marginesie. W tej chwili nie pojawia się, dopóki nie przewiniesz i nie powrócisz, lub oczywiście zamkniesz i ponownie załadujesz dokument.

Sprawdziłem to i widziałem kilka próbek kodu, które używają IViewTaggerProvider zamiast ITaggerProvider. W takich przypadkach okazało się, że program obsługi zdarzenia LayoutChanged może zostać dodany do klasy pochodnej ITaggera, która również zawiera metodę GetTags. Jednak nie udało mi się pomyślnie przełączyć kod z ITaggerProvider na IViewTaggerProvider, rozszerzenie rozbił się po uruchomieniu. Nie wiem, czy to zmiana, która doprowadzi do rozwiązania, czy nie jest to konieczne.

Jak wymusić renderowanie glifu? Czy mogę podnieść jakieś wydarzenie, aby wymusić wykonanie kodu GetTags? Jak podnieść to wydarzenie spoza klasy? Z okna narzędzia na przykład?

+0

Mam to samo pytanie teraz. Czy możesz wspomnieć, czy znalazłeś jakieś obejście tego problemu. Wyjątek dotyczący zmiany układu można przezwyciężyć, usuwając pliki ComponentModelCache. – madufit1

Odpowiedz

0

Jesteś na dobrej drodze, przejście z ITaggerProvider na IViewTaggerProvider pozwoliło mi przerysować glify. Korzystałem z przykładu Implementowanie dopasowującego dopasowującego taggera,, w przykładzie Walkthrough: Displaying Matching Braces, aby wprowadzić te zmiany.

Używanie IViewTaggerProvider można następnie wywołać

TagsChanged?.Invoke(this, new SnapshotSpanEventArgs(
           new SnapshotSpan(
             SourceBuffer.CurrentSnapshot, 
             0, 
             SourceBuffer.CurrentSnapshot.Length))); 

w swoich funkcji jawnie wywołać GetTags i przejść w ciągu przęseł w aktualnej migawce.