Udostępnij za pośrednictwem


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 włączenie 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 opisujący tekst w buforze podzbiorów tekstu w innych buforach.

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 programu .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, które mają być wyświetlane, a także daszek, zaznaczenie i obiekty do adorowania tekstu przy użyciu 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świetlane wiersze 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 platformy.

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 interakcje z wizualnymi aspektami klasyfikacji, które znajdują się 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 zakresy 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ć utrwalone jako dokument systemu plików, ale nie jest to wymagane.

Służy ITextBufferFactoryService do tworzenia pustego buforu tekstowego lub buforu tekstowego zainicjowanego z 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 tekstu są niezmienne, można uzyskać dostęp do migawki tekstu w dowolnym wątku, bez ograniczeń, nawet jeśli bufor tekstu, który reprezentuje, nadal się zmienia.

Migawki tekstu i wiersze 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

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 zakres tekstu w migawce. Jego pozycja Końcowa jest gwarantowana między zerem a długością migawki. Obiekt NormalizedSnapshotSpanCollection składa się z zestawu SnapshotSpan obiektów z tej samej migawki.

Zakresy i normalizedSpanCollections

Obiekt Span reprezentuje interwał, który można zastosować do zakresu tekstu w migawce tekstu. Pozycje migawek są oparte na zera, więc zakresy mogą zaczynać się w dowolnej pozycji, w tym zero. End Właściwość zakresu jest równa sumie jej Start właściwości i jej Length właściwości. 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 pozycje wspólne, w tym pozycję 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 Koniec. 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 w kolejności właściwości Start zakresów. Na liście są scalane nakładające się lub abutting spans. 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 zmianie tekstu ITextEdit, TextVersion i tekstowe

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 migawki buforu podczas uruchamiania 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 zaczęły obowiązywać po ITextEdit zatwierdzeniu obiektu przez wywołanie jego Apply() metody. Jeśli co najmniej jedna edycja nie jest pusta, zostanie utworzona nowa, zostanie utworzona nowa ITextVersionITextSnapshot , a jedno Changed zdarzenie zostanie zgłoszone. Każda wersja tekstu ma inną migawkę tekstu. Migawka tekstu reprezentuje pełny stan buforu tekstowego po transakcji edycji, ale wersja tekstowa opisuje tylko zmiany z jednej migawki do następnej. Ogólnie rzecz biorąc, migawki tekstowe mają być używane raz, a następnie odrzucane, podczas gdy wersje tekstu muszą pozostać aktywne przez jakiś 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 położenie znaku zmiany, zastąpiony ciąg i ciąg zastępczy. Zastąpiony ciąg jest pusty dla wstawiania podstawowego, a ciąg zastępczy jest pusty do usunięcia podstawowego. Znormalizowana kolekcja jest zawsze null dla najnowszej wersji buforu tekstowego.

W dowolnym momencie można utworzyć wystąpienie tylko jednego ITextEdit obiektu dla buforu tekstowego, a wszystkie zmiany tekstu muszą być wykonywane w wątku, który jest właścicielem buforu tekstowego (jeśli została przejęta własność). Edycję tekstu można porzucić, wywołując metodę Cancel lub metodę Dispose .

ITextBuffer Udostępnia Insert()również metody , Delete()i Replace() podobne do tych znalezionych w interfejsie ITextEdit . Wywołanie tych elementów ma taki sam efekt jak utworzenie ITextEdit obiektu, wywołanie podobne, a 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 lub 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 ozdobności 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 są zazwyczaj przypisywane do typu zawartości podczas ich tworzenia, a typ zawartości buforu tekstowego można zmienić.

Typy zawartości mogą dziedziczyć wiele z 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 kontrolera widoku modelu (MVC) definiuje widok tekstu, formatowanie widoku, elementy graficzne, takie jak pasek przewijania i daszek. 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 odwołuje się do obiektu wskazującego ITextViewModel te trzy różne bufory tekstowe: bufor danych, który jest buforem najwyższego poziomu danych, buforem edycji, w którym odbywa się edytowanie, oraz buforem wizualnym, który jest buforem wyświetlanym 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ć widoku (części tekstu widocznej w oknie tekstowym) w taki sam sposób, jak w poziomie, ponieważ jest przewijany w pionie. Rzut w poziomie jest przewijany w poziomie, zmieniając jego współrzędną lewą, tak aby poruszała się względem powierzchni rysunku. Jednak w pionie można przewijać widok tylko przez zmianę renderowanego tekstu, co powoduje LayoutChanged wywoływanie zdarzenia.

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 tekstowym, 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ć w odniesieniu do 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.

Host 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 sformatowanego), możesz użyć IFormattedLineSource polecenia 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

  • Projekcja

  • tworzenie konspektu

  • Powiązania myszy i klawisza

  • 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 są TextMarkerTag przeznaczone do wyróżniania tekstu, OutliningRegionTag tworzenia konspektowania i ErrorTag błędów kompilacji.

Typy klasyfikacji

Interfejs IClassificationType reprezentuje klasę równoważności, która jest abstrakcyjną kategorią tekstu. Typy klasyfikacji mogą dziedziczyć wiele z 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".

Klasyfikacje

Klasyfikacja jest wystąpieniem określonego typu klasyfikacji, zwykle w całym zakresie tekstu. Element jest ClassificationSpan 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 tekstu. Klienci muszą zaimplementować IClassifier udział w klasyfikacji tekstu.

Agregatory klasyfikatora

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 języka C# może oznaczać cały zakres jako komentarz, a klasyfikator języka angielskiego może klasyfikować "produkuje" jako "czasownik" i "metoda" jako "noun". 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 nie jest.

Format klasyfikacji to zestaw właściwości formatowania dla określonego typu klasyfikacji. Te formaty dziedziczą po formacie elementu 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 podkreślenie zquiggle, które jest używane do oznaczania kodu niekompilującego w wielu językach programowania, jest osadzonym ozdobnikiem, a etykietki narzędzi są ozdobione wyskakujące okienka. Ozdoby pochodzą z UIElement elementów i implementują ITag. Dwa wyspecjalizowane typy tagów ozdobnych to SpaceNegotiatingAdornmentTag, dla ozdob, które zajmują tę samą przestrzeń co tekst w widoku, i ErrorTag, dla podkreślenia przełącznika.

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, daszek i zaznaczenie. Deweloperzy mogą jednak definiować więcej warstw i umieszczać je w porządku względem siebie. Trzy rodzaje osadzonych ozdobionych są ozdobami względnymi tekstami (które przenoszą się po przeniesieniu tekstu i są usuwane po usunięciu tekstu), ozdoby względne widoku (które muszą mieć związek z elementami nietekstowymi widoku) i ozdobami kontrolowanymi 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.

Projekcja

Projekcja to technika konstruowania innego rodzaju buforu tekstowego, który nie przechowuje tekstu, ale zamiast tego łączy tekst z innych buforów tekstu. Na przykład bufor projekcji może służyć do łączenia tekstu z dwóch innych buforów 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 z projekcją, można skonstruować w celu ponownego rozmieszczania 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 są rysowane 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 mają następujące elementy:

A: ABCDE
B: vwxyz

Jeśli bufor projekcji P jest tworzony z dwóch zakresów tekstu, jeden z wszystkich buforów A i drugi, który ma cały bufor B, 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 mogą się nie 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 buforu źródłowego nie są dozwolone żadne cykliczne cykliczności.

Zdarzenia są zgłaszane, gdy zmienia się zestaw buforów źródłowych dla buforu projekcji, a zestaw zakresów źródłowych zmienia się. Bufor elizji jest specjalnym rodzajem buforu projekcji. Jest ona używana głównie do tworzenia konspektowania 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 na graf buforów projekcji. Wszystkie bufory tekstowe i bufory projekcji są zbierane w skierowanym grafie acyklicznym, podobnie jak drzewo składni abstrakcyjne 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 buforu, począwszy od najgłębszego buforu.

tworzenie konspektu

Konspektowanie to możliwość rozwijania lub zwijania różnych bloków tekstu w widoku tekstowym. 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ć konspektowania, należy zaimportować element IOutliningManagerService , aby uzyskać element IOutliningManager. Menedżer konspektujący wylicza, zwija i rozwija różne bloki, które są reprezentowane jako ICollapsible obiekty, 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ą IMouseProcessorProviderpowiązań klawiszy , a powiązania klawiszy są definiowane za pomocą elementu IKeyProcessorProvider. Automatycznie IWpfTextViewHost tworzy wystąpienie wszystkich powiązań i łączy je ze zdarzeniami myszy w widoku.

Interfejs IMouseProcessor zawiera procedury obsługi zdarzeń przed procesem 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ć element IEditorOperationsFactoryService , aby uzyskać dostęp do operacji na danym ITextViewobiekcie . Następnie można użyć tych obiektów, aby zmodyfikować zaznaczenie, przewinąć widok lub przenieść daszek do różnych części widoku.

IntelliSense

Funkcja IntelliSense obsługuje uzupełnianie instrukcji, pomoc w podpisie (nazywaną również informacjami o parametrach), szybkie informacje i żarówki.

Uzupełnianie instrukcji zawiera wyskakujące listy potencjalnych uzupełniania nazw metod, elementów XML i innych elementów kodowania lub znaczników. Ogólnie rzecz biorąc, gest użytkownika wywołuje sesję ukończenia. 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 CompletionSet elementy ukończenia 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 zarządzanej struktury rozszerzalności (MEF), przechowywanego w folderze %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.