Udostępnij przez


Wewnątrz edytora

Edytor składa się z kilku różnych podsystemów, które zostały zaprojektowane tak, aby model tekstu edytora był oddzielony od widoku tekstu i interfejsu użytkownika.

W tych sekcjach opisano różne aspekty edytora:

W tych sekcjach opisano funkcje edytora:

Podsystemy

Podsystem modelu tekstu

Podsystem modelu tekstu jest odpowiedzialny za reprezentowanie tekstu i umożliwianie jego manipulacji. Podsystem modelu tekstu zawiera ITextBuffer interfejs, który opisuje sekwencję znaków, które mają być wyświetlane przez edytor. Ten tekst można modyfikować, śledzić i manipulować w inny sposób na wiele sposobów. Model tekstowy udostępnia również typy następujących aspektów:

  • Usługa, która kojarzy tekst z plikami i zarządza odczytywaniem i zapisywaniem ich w systemie plików.

  • Usługa różnicowa, która znajduje minimalne różnice między dwiema sekwencjami obiektów.

  • System do opisywania tekstu w buforze za pomocą podzbiorów tekstu z innych buforów.

Podsystem modelu tekstu jest wolny od koncepcji interfejsu użytkownika. Na przykład nie jest on odpowiedzialny za formatowanie tekstu ani układ tekstu i nie ma wiedzy o ozdobach wizualnych, które mogą być skojarzone z tekstem.

Publiczne typy podsystemu modelu tekstu znajdują się w Microsoft.VisualStudio.Text.Data.dll i Microsoft.VisualStudio.CoreUtility.dll, które zależą tylko od biblioteki klas bazowych .NET Framework i zarządzanej struktury rozszerzalności (MEF).

Podsystem widoku tekstu

Podsystem widoku tekstu jest odpowiedzialny za formatowanie i wyświetlanie tekstu. Typy w tym podsystemie są podzielone na dwie warstwy, w zależności od tego, czy typy opierają się na Windows Presentation Foundation (WPF). Najważniejsze typy to ITextView i IWpfTextView, które kontrolują zestaw wierszy tekstu do wyświetlenia, a także kursor, zaznaczenie oraz narzędzia do ozdabiania tekstu za pomocą elementów interfejsu użytkownika WPF. Ten podsystem zapewnia również marginesy wokół obszaru wyświetlania tekstu. Te marginesy można rozszerzyć i mogą zawierać różne rodzaje zawartości i efektów wizualnych. Przykłady marginesów to wyświetlanie numerów linii i paski przewijania.

Publiczne typy podsystemu widoku tekstu znajdują się w Microsoft.VisualStudio.Text.UI.dll i Microsoft.VisualStudio.Text.UI.Wpf.dll. Pierwszy zestaw zawiera elementy niezależne od platformy, a drugi zawiera elementy specyficzne dla WPF.

Podsystem klasyfikacji

Podsystem klasyfikacji jest odpowiedzialny za określanie właściwości czcionki dla tekstu. Klasyfikator dzieli tekst na różne klasy, na przykład "słowo kluczowe" lub "komentarz". Mapa formatu klasyfikacji odnosi te klasy do rzeczywistych właściwości czcionki, na przykład "Blue Consolas 10 pkt". Te informacje są używane przez widok tekstowy podczas formatowania i renderowania tekstu. Tagowanie, które zostało opisane bardziej szczegółowo w dalszej części tego tematu, umożliwia skojarzenie danych z zakresami tekstu.

Publiczne typy podsystemu klasyfikacji znajdują się w Microsoft.VisualStudio.Text.Logic.dll, i wchodzą w interakcję z wizualnymi aspektami klasyfikacji, które są zawarte w Microsoft.VisualStudio.Text.UI.Wpf.dll.

Podsystem operacji

Podsystem operacji definiuje zachowanie edytora. Zapewnia on implementację poleceń edytora programu Visual Studio i systemu cofania.

Bliżej przyjrzyj się modelowi tekstu i widokowi tekstu

Model tekstu

Podsystem modelu tekstu składa się z różnych grup typów tekstu. Obejmują one bufor tekstu, migawki tekstu i odcinki tekstu.

Bufory tekstowe i migawki tekstu

Interfejs ITextBuffer reprezentuje sekwencję znaków Unicode zakodowanych przy użyciu formatu UTF-16, który jest kodowaniem używanym przez String typ w programie .NET Framework. Bufor tekstowy może być zapisany jako dokument systemu plików, jednak nie jest to wymagane.

ITextBufferFactoryService służy do tworzenia pustego buforu tekstowego lub buforu tekstowego zainicjowanego za pomocą ciągu lub z TextReader. Bufor tekstowy można utrwalić w systemie plików jako ITextDocument.

Każdy wątek może edytować bufor tekstu, dopóki wątek nie przejmie własności buforu tekstowego przez wywołanie metody TakeThreadOwnership. Następnie tylko ten wątek może wykonywać edycje.

Bufor tekstu może przechodzić przez wiele wersji w okresie jego istnienia. Nowa wersja jest generowana za każdym razem, gdy bufor jest edytowany, a niezmienna ITextSnapshot reprezentuje zawartość tej wersji buforu. Ponieważ migawki tekstowe są niezmienne, można uzyskiwać dostęp do migawki tekstowej w dowolnym wątku, bez ograniczeń, nawet jeśli bufor tekstowy, który reprezentują, nadal się zmienia.

Zrzuty tekstu i linie migawki tekstu

Zawartość migawki tekstu można wyświetlić jako sekwencję znaków lub jako sekwencję wierszy. Znaki i wiersze są indeksowane począwszy od zera. Pusta migawka tekstu zawiera zero znaków i jeden pusty wiersz. Wiersz jest rozdzielany przez dowolną prawidłową sekwencję znaków podziału wiersza Unicode lub na początku lub na końcu buforu. Znaki podziału wiersza są jawnie reprezentowane w migawce tekstu, a podziały wierszy w migawce tekstu nie muszą być takie same.

Uwaga / Notatka

Aby uzyskać więcej informacji na temat znaków podziału wiersza w edytorze programu Visual Studio, zobacz Kodowanie i podziały wierszy.

Wiersz tekstu jest reprezentowany przez ITextSnapshotLine obiekt, który można uzyskać z migawki tekstu dla określonego numeru wiersza lub dla określonej pozycji znaku.

SnapshotPoints, SnapshotSpans i NormalizedSnapshotSpanCollections

Obiekt SnapshotPoint reprezentuje pozycję znaku w migawce. Pozycja jest gwarantowana między zerem a długością migawki. Obiekt SnapshotSpan reprezentuje odcinek tekstu w migawce. Jego pozycja końcowa nakłada się na zakres od zera do długości migawki. Obiekt NormalizedSnapshotSpanCollection składa się z zestawu SnapshotSpan obiektów z tej samej migawki.

Zakresy i znormalizowaneKolekcjeZakresów

Obiekt Span reprezentuje interwał, który można zastosować do zakresu tekstu w migawce tekstu. Pozycje migawek są indeksowane od zera, więc zakresy mogą zaczynać się od dowolnej pozycji, w tym od zera. Właściwość End zakresu jest równa sumie jego właściwości Start i Length. Obiekt Span nie zawiera znaku indeksowanego przez End właściwość . Na przykład zakres o wartości Start=5 i Length=3 ma wartość End=8 i zawiera znaki na pozycjach 5, 6 i 7. Notacja dla tego zakresu to [5..8).

Dwa przedziały przecinają się, jeśli mają jakiekolwiek punkty wspólne, w tym punkt koniec. W związku z tym skrzyżowanie [3, 5) i [2, 7) to [3, 5) i skrzyżowanie [3, 5) i [5, 7) wynosi [5, 5). (Zwróć uwagę, że [5, 5) jest pustym zakresem).

Dwa zakresy nakładają się, jeśli mają wspólne pozycje, z wyjątkiem pozycji End. Pusta rozpiętość nigdy nie nakłada się na inne zakresy, a nakładanie się dwóch zakresów nigdy nie jest puste.

A NormalizedSpanCollection to lista zakresów według właściwości początkowych zakresów. Na liście scalane są nakładające się lub przylegające odcinki. Na przykład biorąc pod uwagę zestaw zakresów [5..9), [0..1), [3..6) i [9..10), znormalizowana lista zakresów to [0..1), [3..10).

Powiadomienia o zmianach tekstu, ITextEdit i TextVersion

Zawartość buforu tekstowego można zmienić przy użyciu ITextEdit obiektu. Utworzenie takiego obiektu (przy użyciu jednej z CreateEdit() metod ITextBuffer) rozpoczyna transakcję tekstową składającą się z edycji tekstu. Każda edycja zastępuje jakiś zakres tekstu w buforze przez ciąg. Współrzędne i zawartość każdej edycji są wyrażane względem zrzutu buforu w momencie rozpoczęcia transakcji. Obiekt ITextEdit dostosowuje współrzędne edycji, które mają wpływ na inne zmiany w tej samej transakcji.

Rozważmy na przykład bufor tekstowy zawierający następujący ciąg:

abcdefghij

Zastosuj transakcję zawierającą dwie edycje, jedną edycję, która zastępuje zakres na [2..4) przy użyciu znaku X i drugiej edycji, która zastępuje zakres [6..9) przy użyciu znaku Y. Wynikiem jest ten bufor:

abXefYj

Współrzędne drugiej edycji zostały obliczone w odniesieniu do zawartości buforu na początku transakcji przed zastosowaniem pierwszej edycji.

Zmiany w buforze wchodzą w życie po ITextEdit zatwierdzeniu obiektu przez wywołanie jego Apply() metody. Jeśli co najmniej jedna edycja nie jest pusta, zostanie utworzona nowa ITextVersion, zostanie utworzona nowa ITextSnapshot, a jedno Changed zdarzenie zostanie zgłoszone. Każda wersja tekstu ma inną migawkę tekstu. Migawka tekstu reprezentuje pełen stan bufora tekstowego po transakcji edycji, ale wersja tekstu opisuje jedynie zmiany między jedną migawką a następną. Ogólnie rzecz biorąc, migawki tekstu są przeznaczone do jednorazowego użycia, a następnie usunięcia, podczas gdy wersje tekstu muszą pozostać aktywne przez pewien czas.

Wersja tekstowa zawiera element INormalizedTextChangeCollection. W tej kolekcji opisano zmiany, które po zastosowaniu do migawki tworzą kolejną migawkę. Każda ITextChange w kolekcji zawiera pozycję znaku, w którym nastąpiła zmiana, oryginalny ciąg i ciąg zamienny. Zastępowany ciąg jest pusty w przypadku podstawowej operacji wstawienia, a ciąg zastępujący jest pusty w przypadku podstawowej operacji usunięcia. Znormalizowana kolekcja jest zawsze null dla najnowszej wersji buforu tekstu.

W każdym momencie może być instancjonowany tylko jeden ITextEdit obiekt dla bufora tekstowego, a wszystkie edycje tekstu muszą być wykonywane w wątku, który posiada bufor tekstowy (jeśli własność została przejęta). Edycję tekstu można porzucić, wywołując metodę Cancel lub metodę Dispose .

ITextBuffer udostępnia również metody Insert(), Delete() i Replace() podobne do tych z interfejsu ITextEdit. Użycie tych metod ma taki sam efekt jak utworzenie obiektu ITextEdit, użycie podobnego wywołania i następnie zastosowanie edycji.

Punkty śledzenia i zakresy śledzenia

Obiekt ITrackingPoint reprezentuje pozycję znaku w buforze tekstowym. Jeśli bufor jest edytowany w sposób, który powoduje przesunięcie położenia znaku, punkt śledzenia przesuwa się z nim. Jeśli na przykład punkt śledzenia odwołuje się do pozycji 10 w buforze, a pięć znaków jest wstawionych na początku buforu, punkt śledzenia odwołuje się do pozycji 15. Jeśli wstawienie odbywa się dokładnie na pozycji oznaczonej przez punkt śledzenia, jego zachowanie jest określane przez PointTrackingModeelement, który może być albo Positive albo Negative. Jeśli tryb śledzenia jest dodatni, punkt śledzenia odwołuje się do tego samego znaku, który znajduje się teraz na końcu wstawiania. Jeśli tryb śledzenia jest ujemny, punkt śledzenia odwołuje się do pierwszego wstawionego znaku w oryginalnej pozycji. Jeśli znak w pozycji reprezentowanej przez punkt śledzenia zostanie usunięty, punkt śledzenia przechodzi do pierwszego znaku, który następuje po usuniętym zakresie. Jeśli na przykład punkt śledzenia odwołuje się do znaku na pozycji 5, a znaki w pozycjach od 3 do 6 są usuwane, punkt śledzenia odwołuje się do znaku na pozycji 3.

Obiekt ITrackingSpan reprezentuje zakres znaków, a nie tylko jedną pozycję. Jego zachowanie jest określane przez jego SpanTrackingMode. Jeśli tryb śledzenia zakresu to SpanTrackingMode.EdgeInclusive, zakres śledzenia rośnie w celu uwzględnienia tekstu wstawionego na jego krawędziach. Jeśli tryb śledzenia zakresu to SpanTrackingMode.EdgeExclusive, zakres śledzenia nie zawiera tekstu wstawionego na krawędziach. Jeśli jednak tryb śledzenia zakresu to SpanTrackingMode.EdgePositive, wstawienie wypycha bieżącą pozycję do początku, a jeśli tryb śledzenia zakresu to SpanTrackingMode.EdgeNegative, wstawienie wypycha bieżącą pozycję do końca.

Możesz uzyskać pozycję punktu śledzenia lub zakres zakresu śledzenia dla dowolnej migawki buforu tekstowego, do którego należą. Punkty śledzenia i zakresy śledzenia mogą być bezpiecznie przywołyne z dowolnego wątku.

Typy zawartości

Typy zawartości to mechanizm definiowania różnych rodzajów zawartości. Typ zawartości może być typem pliku, takim jak "text", "code" lub "binary", albo typem technologii, takim jak "xml", "vb" lub "c#". Na przykład słowo "using" jest słowem kluczowym w językach C# i Visual Basic, ale nie w innych językach programowania. W związku z tym definicja tego słowa kluczowego będzie ograniczona do typów zawartości "c#" i "vb".

Typy zawartości są używane jako filtr do ozdób i innych elementów edytora. Wiele funkcji edytora i punktów rozszerzenia są definiowane na typ zawartości. Na przykład kolorowanie tekstu różni się w przypadku plików zwykłego tekstu, plików XML i plików kodu źródłowego języka Visual Basic. Bufory tekstowe zazwyczaj otrzymują typ zawartości podczas tworzenia, a typ zawartości buforu tekstowego można zmienić.

Typy zawartości mogą wielokrotnie dziedziczyć od innych typów zawartości. Element ContentTypeDefinition umożliwia określenie wielu typów bazowych jako elementów nadrzędnych danego typu zawartości.

Deweloperzy mogą definiować własne typy zawartości i rejestrować je przy użyciu elementu IContentTypeRegistryService. Wiele funkcji edytora można zdefiniować w odniesieniu do określonego typu zawartości przy użyciu elementu ContentTypeAttribute. Na przykład można zdefiniować marginesy edytora, ozdobniki i programy obsługi myszy, aby były stosowane tylko do edytorów, które wyświetlają określone typy zawartości.

Widok tekstu

Część widoku wzorca model-widok-kontroler (MVC) definiuje widok tekstu, formatowanie widoku oraz elementy graficzne, takie jak pasek przewijania i kursor. Wszystkie elementy prezentacji edytora programu Visual Studio są oparte na WPF.

Widoki tekstowe

Interfejs ITextView to niezależna od platformy reprezentacja widoku tekstu. Służy głównie do wyświetlania dokumentów tekstowych w oknie, ale może być również używany do innych celów, na przykład w etykietce narzędzia.

Widok tekstu odwołuje się do różnych rodzajów buforów tekstowych. Właściwość TextViewModel odnosi się do obiektu ITextViewModel, który wskazuje na te trzy różne bufory tekstowe: bufor danych, który jest najwyższym buforem danych, bufor edycji, w którym odbywają się edycje, oraz bufor wizualny, który jest wyświetlany w widoku tekstu.

Tekst jest sformatowany na podstawie klasyfikatorów dołączonych do bazowego buforu tekstu i jest ozdobiony przy użyciu dostawców ozdobników dołączonych do samego widoku tekstu.

Układ współrzędnych widoku tekstu

Układ współrzędnych widoku tekstu określa pozycje w widoku tekstowym. W tym układzie współrzędnych wartość x 0.0 odpowiada lewej krawędzi wyświetlanego tekstu, a wartość y 0.0 odpowiada górnej krawędzi wyświetlanego tekstu. Współrzędna x zwiększa się od lewej do prawej, a współrzędna y zwiększa się od góry do dołu.

Nie można przewijać obszaru widocznego (części tekstu widocznej w oknie tekstowym) poziomo w taki sam sposób, jak przewija się go pionowo. Widok jest przewijany poziomo, zmieniając jego współrzędną lewą, aby poruszał się względem powierzchni rysunku. Jednak w pionie można przewijać obszar widoku tylko przez zmianę treści renderowanej, co powoduje wywołanie zdarzenia LayoutChanged.

Odległości w układzie współrzędnych odpowiadają pikselom logicznym. Jeśli powierzchnia renderowania tekstu jest wyświetlana bez przekształcenia skalowania, jedna jednostka w systemie współrzędnych renderowania tekstu odpowiada jednemu pikselowi na ekranie.

Marginesy

Interfejs ITextViewMargin reprezentuje margines i umożliwia kontrolę widoczności marginesu i jego rozmiaru. Istnieją cztery wstępnie zdefiniowane marginesy o nazwie "Góra", "Lewa", "Prawa" i "Dolna" i są dołączone do górnej, dolnej, lewej lub prawej krawędzi widoku. Te marginesy to kontenery, w których można umieścić inne marginesy. Interfejs definiuje metody zwracające rozmiar marginesu i widoczność marginesu. Marginesy to elementy wizualne, które zawierają dodatkowe informacje o widoku tekstu, do którego są dołączone. Na przykład margines liczby wierszy wyświetla numery wierszy dla widoku tekstowego. Margines glyph wyświetla elementy interfejsu użytkownika.

Interfejs IWpfTextViewMarginProvider obsługuje tworzenie i umieszczanie marginesów. Marginesy można porządkować względem innych marginesów. Marginesy o wyższym priorytcie znajdują się bliżej widoku tekstu. Jeśli na przykład istnieją dwa lewe marginesy, margines A i margines B, a margines B ma niższy priorytet niż margines A, margines B pojawia się po lewej stronie marginesu A.

Serwer widoku tekstu

Interfejs IWpfTextViewHost zawiera widok tekstu i wszystkie dekoracje dołączające, które towarzyszą widokowi, na przykład paski przewijania. Host widoku tekstu zawiera również marginesy dołączone do obramowania widoku.

Sformatowany tekst

Tekst wyświetlany w widoku tekstowym składa się z ITextViewLine obiektów. Każdy wiersz widoku tekstu odpowiada jednemu wierszowi tekstu w widoku tekstowym. Długie wiersze w bazowym buforze tekstu mogą być częściowo zaciemniane (jeśli zawijanie wyrazów nie jest włączone) lub podzielone na wiele wierszy widoku tekstu. Interfejs ITextViewLine zawiera metody i właściwości mapowania między współrzędnymi i znakami oraz dla ozdobników, które mogą być skojarzone z linią.

ITextViewLine obiekty są tworzone przy użyciu interfejsu IFormattedLineSource . Jeśli interesuje Cię tylko tekst, który jest obecnie wyświetlany w widoku, możesz zignorować źródło formatowania. Jeśli interesuje Cię format tekstu, który nie jest wyświetlany w widoku (na przykład w celu obsługi wycinania i wklejania tekstu w formacie RTF), możesz użyć IFormattedLineSource do formatowania tekstu w buforze tekstowym.

Widok tekstu formatuje jeden ITextSnapshotLine naraz.

Funkcje edytora

Funkcje edytora są zaprojektowane tak, aby definicja funkcji różniła się od jej implementacji. Edytor zawiera następujące funkcje:

  • Tagi i klasyfikatory

  • Ozdoby

  • Projection

  • Outlining

  • Powiązania myszy i klawiszy

  • Operacje i elementy pierwotne

  • IntelliSense

Tagi i klasyfikatory

Tagi to znaczniki skojarzone z zakresem tekstu. Można je prezentować na różne sposoby, na przykład za pomocą kolorowania tekstu, podkreśleń, grafiki lub wyskakujących okienek. Klasyfikatory są jednym rodzajem tagu.

Inne rodzaje tagów to TextMarkerTag do wyróżniania tekstu, OutliningRegionTag do obrysowywania, i ErrorTag do błędów kompilacji.

Typy klasyfikacji

Interfejs IClassificationType reprezentuje klasę równoważności, która jest abstrakcyjną kategorią tekstu. Typy klasyfikacji mogą dziedziczyć od wielu innych typów klasyfikacji. Na przykład klasyfikacje języków programowania mogą obejmować "słowo kluczowe", "komentarz" i "identyfikator", które wszystkie dziedziczą z "kodu". Typy klasyfikacji języka naturalnego mogą obejmować "noun", "verb" i "przymiotnik", które dziedziczą z "języka naturalnego".

Classifications

Klasyfikacja jest wystąpieniem określonego typu klasyfikacji, zwykle w całym zakresie tekstu. ClassificationSpan jest używany do reprezentowania klasyfikacji. Zakres klasyfikacji można traktować jako etykietę obejmującą określony zakres tekstu i informuje system, że ten zakres tekstu ma określony typ klasyfikacji.

Klasyfikatorów

Mechanizm IClassifier , który dzieli tekst na zestaw klasyfikacji. Klasyfikatory muszą być zdefiniowane dla określonych typów zawartości i tworzone dla określonych buforów tekstowych. Klienci muszą zaimplementować IClassifier, aby uczestniczyć w klasyfikacji tekstu.

Agregatory klasyfikatorów

Agregator klasyfikatora to mechanizm, który łączy wszystkie klasyfikatory dla jednego buforu tekstowego w tylko jeden zestaw klasyfikacji. Na przykład klasyfikator języka C# i klasyfikator języka angielskiego mogą tworzyć klasyfikacje w komentarzu w pliku C#. Rozważ następujący komentarz:

// This method produces a classifier

Klasyfikator C# może oznaczać cały zakres jako komentarz, a klasyfikator dla języka angielskiego może klasyfikować „produkuje” jako „czasownik” i „metoda” jako „rzeczownik”. Agregator tworzy zestaw klasyfikacji nienakładających się, a typ zestawu jest oparty na wszystkich wkładach.

Agregator klasyfikatora jest również klasyfikatorem, ponieważ dzieli tekst na zestaw klasyfikacji. Agregator klasyfikatora zapewnia również, że nie ma nakładających się klasyfikacji i czy klasyfikacje są sortowane. Poszczególne klasyfikatory mogą zwracać dowolny zestaw klasyfikacji w dowolnej kolejności i nakładać się w dowolny sposób.

Formatowanie klasyfikacji i kolorowanie tekstu

Formatowanie tekstu to przykład funkcji opartej na klasyfikacji tekstu. Jest on używany przez warstwę widoku tekstu do określania wyświetlania tekstu w aplikacji. Obszar formatowania tekstu zależy od WPF, ale logiczna definicja klasyfikacji już nie.

Format klasyfikacji to zestaw właściwości formatowania dla określonego typu klasyfikacji. Te formaty dziedziczą po formacie nadrzędnego typu klasyfikacji.

Element IClassificationFormatMap jest mapą typu klasyfikacji na zestaw właściwości formatowania tekstu. Implementacja mapy formatu w edytorze obsługuje wszystkie eksporty formatów klasyfikacji.

Ozdoby

Ozdoby to efekty graficzne, które nie są bezpośrednio związane z czcionką i kolorem znaków w widoku tekstowym. Na przykład czerwone faliste podkreślenie, które jest używane do oznaczania niekompilującego się kodu w wielu językach programowania, jest osadzonym ozdobnikiem, a etykietki narzędzi są wyskakującymi ozdobnikami. Ozdoby pochodzą z UIElement i implementują ITag. Dwa wyspecjalizowane typy tagów ozdobnych to SpaceNegotiatingAdornmentTag, dla ozdób, które zajmują tę samą przestrzeń co tekst w widoku, i ErrorTag, dla falistego podkreślenia.

Osadzone ozdoby to grafika, która stanowi część sformatowanego widoku tekstu. Są one zorganizowane w różnych warstwach kolejności Z. Istnieją trzy wbudowane warstwy, w następujący sposób: tekst, kursor i zaznaczenie. Deweloperzy mogą jednak definiować więcej warstw i umieszczać je w porządku względem siebie. Trzy rodzaje osadzonych ozdób to ozdoby względne względem tekstu (które przenoszą się po przeniesieniu tekstu i są usuwane po usunięciu tekstu), ozdoby względne względem widoku (które dotyczą elementów niezwiązanych z tekstem widoku), oraz ozdoby kontrolowane przez właściciela (deweloper musi zarządzać ich umieszczaniem).

Wyskakujące okna to grafika wyświetlana w małym oknie nad widokiem tekstowym, na przykład etykietkami narzędzi.

Projection

Projekcja to technika konstruowania odmiennego rodzaju buforu tekstowego, który sam w sobie nie przechowuje tekstu, ale zamiast tego łączy tekst z innych buforów tekstowych. Na przykład bufor projekcji może służyć do łączenia tekstu z dwóch innych i prezentowania wyniku tak, jakby był w jednym buforze lub ukrywał części tekstu w jednym buforze. Bufor projekcji może pełnić rolę buforu źródłowego do innego buforu projekcji. Zestaw buforów, które są powiązane poprzez projekcję, można skonstruować do przearanżowania tekstu na wiele różnych sposobów. (Taki zestaw jest również nazywany grafem buforu). Funkcja tworzenia konspektu tekstu programu Visual Studio jest implementowana przy użyciu buforu projekcji w celu ukrycia zwiniętego tekstu, a edytor programu Visual Studio dla stron ASP.NET używa projekcji do obsługi języków osadzonych, takich jak Visual Basic i C#.

Element IProjectionBuffer jest tworzony przy użyciu polecenia IProjectionBufferFactoryService. Bufor projekcji jest reprezentowany przez uporządkowaną sekwencję ITrackingSpan obiektów, które są nazywane zakresami źródłowymi. Zawartość tych zakresów jest przedstawiana jako sekwencja znaków. Bufory tekstowe, z których pochodzą zakresy źródłowe, są nazywane buforami źródłowymi. Klienci buforu projekcji nie muszą mieć świadomości, że różni się ona od zwykłego buforu tekstowego.

Bufor projekcji nasłuchuje zdarzeń zmiany tekstu w buforach źródłowych. Gdy tekst w zakresie źródłowym zmieni się, bufor projekcji mapuje współrzędne zmienionego tekstu na własne współrzędne i zgłasza odpowiednie zdarzenia zmiany tekstu. Rozważmy na przykład bufory źródłowe A i B, które zawierają następującą zawartość:

A: ABCDE
B: vwxyz

Jeśli bufor projekcji P jest tworzony z dwóch zakresów tekstu, z których jeden zawiera cały bufor A, a drugi zawiera cały bufor B, to P ma następującą zawartość:

P: ABCDEvwxyz

Jeśli podciąg xy zostanie usunięty z buforu B, bufor P zgłasza zdarzenie wskazujące, że znaki na pozycjach 7 i 8 zostały usunięte.

Bufor projekcji można również edytować bezpośrednio. Propaguje edycje do odpowiednich buforów źródłowych. Jeśli na przykład ciąg zostanie wstawiony do buforu P na pozycji 6 (oryginalna pozycja znaku "v"), wstawianie jest propagowane do buforu B na pozycji 1.

Istnieją ograniczenia dotyczące zakresów źródłowych, które przyczyniają się do buforu projekcji. Zakresy źródłowe nie mogą się nakładać; lokalizacja w buforze projekcji nie może mapować na więcej niż jedną lokalizację w dowolnym buforze źródłowym, a lokalizacja w buforze źródłowym nie może mapować na więcej niż jedną lokalizację w buforze projekcji. W relacji z buforem źródłowym nie są dozwolone cykliczności.

Zdarzenia są zgłaszane, gdy zmienia się zestaw buforów źródłowych dla buforu projekcji oraz gdy zmienia się zestaw zakresów źródłowych. Bufor elizji jest specjalnym rodzajem buforu projekcji. Jest używana głównie do tworzenia konspektów i operacji, które rozszerzają i zwijają bloki tekstu. Bufor elizji jest oparty tylko na jednym buforze źródłowym, a zakresy w buforze elizji muszą być uporządkowane tak samo jak w buforze źródłowym.

Wykres buforu

Interfejs IBufferGraph umożliwia mapowanie w całym grafie buforów projekcji. Wszystkie bufory tekstowe i bufory projekcyjne są zbierane w skierowanym grafie acyklicznym, podobnie jak abstrakcyjne drzewo składni, które jest tworzone przez kompilator języka. Wykres jest definiowany przez górny bufor, który może być dowolnym buforem tekstowym. Wykres buforu może mapować od punktu w górnym buforze do punktu w buforze źródłowym lub z zakresu w górnym buforze do zestawu zakresów w buforze źródłowym. Podobnie może mapować punkt lub zakres z buforu źródłowego na punkt w górnym buforze. Wykresy buforu są tworzone przy użyciu elementu IBufferGraphFactoryService.

Zdarzenia i bufory projekcji

Po zmodyfikowaniu buforu projekcji modyfikacje są wysyłane z buforu projekcji do buforów, które od niego zależą. Po zmodyfikowaniu wszystkich buforów, są wywoływane zdarzenia zmiany buforów, zaczynając od najgłębszego buforu.

Outlining

Funkcja zwijania umożliwia rozwijanie lub zwijanie różnych bloków tekstu w edytorze tekstu. Konspektowanie jest definiowane jako rodzaj ITagelementu w taki sam sposób, jak zdefiniowane ozdoby. To OutliningRegionTag tag, który definiuje region tekstowy, który można rozwinąć lub zwinąć. Aby użyć tworzenia zarysów, należy zaimportować element IOutliningManagerService aby uzyskać element IOutliningManager. Menedżer struktury wylicza, zwija i rozwija różne bloki, które są przedstawiane jako obiekty ICollapsible, i odpowiednio zgłasza zdarzenia.

Powiązania myszy

Powiązania myszy łączą ruchy myszy z różnymi poleceniami. Powiązania myszy są definiowane za pomocą IMouseProcessorProvider, a powiązania klawiszy są definiowane za pomocą IKeyProcessorProvider. Element IWpfTextViewHost automatycznie instancjuje wszystkie powiązania i łączy je ze zdarzeniami myszy w widoku.

Interfejs IMouseProcessor zawiera procedury obsługi zdarzeń przed przetwarzaniem i po przetworzeniu dla różnych zdarzeń myszy. Aby obsłużyć jedno ze zdarzeń, można zastąpić niektóre metody w pliku MouseProcessorBase.

Operacje edytora

Operacje edytora mogą służyć do automatyzowania interakcji z edytorem w celu wykonywania skryptów lub innych celów. Możesz zaimportować IEditorOperationsFactoryService, aby uzyskać dostęp do operacji na danym ITextView. Następnie można użyć tych obiektów, aby zmodyfikować zaznaczenie, przewinąć widok lub przenieść kursor do różnych części widoku.

IntelliSense

Funkcja IntelliSense obsługuje uzupełnianie instrukcji, pomoc dotyczącą sygnatur (znana również jako informacje o parametrach), szybkie informacje i żółte żarówki.

Uzupełnianie kodu zawiera wyskakujące listy potencjalnych uzupełnień nazw metod, elementów XML i innych elementów kodu lub znaczników. Ogólnie rzecz biorąc, gest użytkownika wywołuje sesję zamknięcia. Sesja wyświetla listę potencjalnych uzupełnień, a użytkownik może wybrać jedną lub odrzucić listę. Element ICompletionBroker jest odpowiedzialny za tworzenie i wyzwalanie elementu ICompletionSession. Funkcja ICompletionSource oblicza elementy do ukończenia CompletionSet dla sesji.

Rozwiązywanie problemów z importowaniem/eksportowaniem: uzyskiwanie dostępu do dziennika błędów kompozycji MEF

Problemy mogą wystąpić, jeśli spróbujesz zaimportować coś, co nie istnieje w bieżącej instalacji programu VS, lub jeśli niepoprawnie utworzysz import lub eksport. Podstawowym sposobem znalezienia i rozwiązania tych problemów jest odwołanie się do dziennika błędów kompozycji programu Managed Extensibility Framework (MEF) przechowywanego w %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.