Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De editor bestaat uit verschillende subsystemen, die zijn ontworpen om het editortekstmodel gescheiden te houden van de tekstweergave en de gebruikersinterface.
In deze secties worden verschillende aspecten van de editor beschreven:
In deze secties worden de functies van de editor beschreven:
De subsystemen
Subsysteem voor tekstmodel
Het subsysteem van het tekstmodel is verantwoordelijk voor het weergeven van tekst en het inschakelen van de manipulatie. Het subsysteem voor het tekstmodel bevat de ITextBuffer interface, waarin de reeks tekens wordt beschreven die door de editor moeten worden weergegeven. Deze tekst kan op veel manieren worden gewijzigd, bijgehouden en anderszins worden bewerkt. Het tekstmodel biedt ook typen voor de volgende aspecten:
Een service die tekst koppelt aan bestanden en het lezen en schrijven ervan beheert in het bestandssysteem.
Een differentiërende service waarmee de minimale verschillen tussen twee reeksen objecten worden gevonden.
Een systeem voor het beschrijven van de tekst in een buffer in termen van subsets van de tekst in andere buffers.
Het subsysteem voor het tekstmodel is vrij van gebruikersinterfaceconcepten (UI). Het is bijvoorbeeld niet verantwoordelijk voor tekstopmaak of tekstindeling en heeft geen kennis van visuele decoraties die aan de tekst kunnen worden gekoppeld.
De openbare typen van het subsysteem voor het tekstmodel bevinden zich in Microsoft.VisualStudio.Text.Data.dll en Microsoft.VisualStudio.CoreUtility.dll, die alleen afhankelijk zijn van de basisbibliotheek van .NET Framework en het Managed Extensibility Framework (MEF).
Subsysteem voor tekstweergave
Het subsysteem voor de tekstweergave is verantwoordelijk voor het opmaken en weergeven van tekst. De typen in dit subsysteem zijn onderverdeeld in twee lagen, afhankelijk van of de typen afhankelijk zijn van Windows Presentation Foundation (WPF). De belangrijkste typen zijn ITextView en IWpfTextView, die de set tekstregels bepalen die moeten worden weergegeven, en ook de caret, de selectie en de faciliteiten voor het versieren van de tekst met behulp van WPF UI-elementen. Dit subsysteem biedt ook marges rond het tekstweergavegebied. Deze marges kunnen worden uitgebreid en kunnen verschillende soorten inhoud en visuele effecten bevatten. Voorbeelden van marges zijn weergaven van regelnummers en schuifbalken.
De openbare typen van het subsysteem voor de tekstweergave zijn opgenomen in Microsoft.VisualStudio.Text.UI.dll en Microsoft.VisualStudio.Text.UI.Wpf.dll. De eerste assembly bevat de platformonafhankelijke elementen en de tweede bevat de WPF-specifieke elementen.
Classificatiesubsysteem
Het classificatiesubsysteem is verantwoordelijk voor het bepalen van de lettertype-eigenschappen voor tekst. Een classificatie breekt de tekst in verschillende klassen, bijvoorbeeld 'trefwoord' of 'opmerking'. De indelingskaart voor classificatie heeft betrekking op de werkelijke lettertype-eigenschappen, bijvoorbeeld 'Blue Consolas 10 pt'. Deze informatie wordt gebruikt door de tekstweergave wanneer deze tekst opmaakt en weergeeft. Met taggen, dat verderop in dit onderwerp nader wordt beschreven, kunnen gegevens worden gekoppeld aan tekstbereiken.
De openbare typen van het classificatiesubsysteem zijn opgenomen in Microsoft.VisualStudio.Text.Logic.dll, en ze communiceren met de visuele aspecten van classificatie, die zijn opgenomen in Microsoft.VisualStudio.Text.UI.Wpf.dll.
Operaties subsysteem
Het subsysteem bewerkingen definieert het gedrag van de editor. Het biedt de implementatie voor opdrachten van de Visual Studio-editor en het ongedaansysteem.
Een beter overzicht van het tekstmodel en de tekstweergave
Het tekstmodel
Het subsysteem voor het tekstmodel bestaat uit verschillende groeperingen van teksttypen. Dit zijn onder andere de tekstbuffer, momentopnamen van tekst en tekstbereiken.
Tekstbuffers en tekstmomentopnamen
De ITextBuffer interface vertegenwoordigt een reeks Unicode-tekens die zijn gecodeerd met behulp van UTF-16. Dit is de codering die wordt gebruikt door het String type in .NET Framework. Een tekstbuffer kan worden bewaard als een bestandssysteemdocument, maar dit is niet vereist.
Deze ITextBufferFactoryService wordt gebruikt om een lege tekstbuffer of een tekstbuffer te maken die wordt geïnitialiseerd op basis van een tekenreeks of van TextReader. De tekstbuffer kan naar het bestandssysteem worden weggeschreven als een ITextDocument.
Elke thread kan de tekstbuffer bewerken totdat een thread eigenaar wordt van de tekstbuffer door aan te roepen TakeThreadOwnership. Daarna kan alleen die thread bewerkingen uitvoeren.
Tijdens de levensduur kan een tekstbuffer veel versies doorlopen. Wordt een nieuwe versie gegenereerd elke keer dat de buffer wordt bewerkt, en vertegenwoordigt een onveranderbare ITextSnapshot de inhoud van die versie van de buffer. Omdat tekstmomentopnamen onveranderbaar zijn, hebt u toegang tot een tekstmomentopname op elke thread, zonder beperkingen, zelfs als de tekstbuffer die deze vertegenwoordigt, blijft veranderen.
Tekstmomentopnamen en tekstmomentopnamelijnen
U kunt de inhoud van een tekstmomentopname weergeven als een reeks tekens of als een reeks regels. Tekens en tekstregels worden beide geïndexeerd vanaf nul. Een lege tekstmomentopname bevat nul tekens en één lege regel. Een regel wordt gescheiden door een geldige Unicode-tekenreeks voor regeleinde of door het begin of einde van de buffer. Regeleindetekens worden expliciet weergegeven in de momentopname van de tekst en de regeleinden in een tekstmomentopname hoeven niet allemaal hetzelfde te zijn.
Opmerking
Zie Coderingen en regeleinden voor meer informatie over regeleindetekens in de Visual Studio-editor.
Een tekstregel wordt vertegenwoordigd door een ITextSnapshotLine object, dat kan worden verkregen uit een tekstmomentopname voor een bepaald regelnummer of voor een bepaalde tekenpositie.
SnapshotPoints, SnapshotSpans en NormalizedSnapshotSpanCollections
A SnapshotPoint vertegenwoordigt een tekenpositie in een momentopname. De positie ligt gegarandeerd tussen nul en de lengte van de momentopname. A SnapshotSpan vertegenwoordigt een reeks tekst in een momentopname. De eindpositie ligt gegarandeerd tussen nul en de lengte van de momentopname. Het NormalizedSnapshotSpanCollection bestaat uit een set SnapshotSpan objecten uit dezelfde momentopname.
Spans en NormalizedSpanCollections
A Span vertegenwoordigt een interval dat kan worden toegepast op een reeks tekst in een tekstmomentopname. Momentopnameposities zijn op nul gebaseerd, zodat spanen op elke positie kunnen beginnen, inclusief nul. De eigenschap van End van een span is gelijk aan de som van de eigenschap Start en de eigenschap Length. A Span bevat niet het teken dat door de End eigenschap wordt geïndexeerd. Een bereik met Start=5 en Length=3 heeft bijvoorbeeld End=8 en bevat de tekens op posities 5, 6 en 7. De notatie voor deze periode is [5..8).
Twee punten snijden elkaar als ze gemeenschappelijke posities hebben, inclusief de eindpositie. Daarom is het snijpunt van [3, 5) en [2, 7) [3, 5) en het snijpunt van [3, 5) en [5, 7) [5, 5). (U ziet dat [5, 5) een lege periode is.)
Twee spanten overlappen elkaar als ze functies gemeen hebben, met uitzondering van de eindpositie. Een lege spanwijdte overlapt nooit een andere spanwijdte en de overlapping van twee spanten is nooit leeg.
A NormalizedSpanCollection is een lijst met spanten in de volgorde van de begineigenschappen van de spanten. In de lijst worden overlappende of grenzende segmenten samengevoegd. Bijvoorbeeld, gezien de reeks spans [5..9), [0..1), [3..6) en [9..10), is de genormaliseerde lijst met spanten [0..1), [3..10).
Meldingen voor ITextEdit, TextVersion en tekstwijziging
De inhoud van een tekstbuffer kan worden gewijzigd met behulp van een ITextEdit object. Het maken van een dergelijk object (met behulp van een van de CreateEdit() methoden van ITextBuffer) start een teksttransactie die bestaat uit tekstbewerkingen. Elke bewerking is een vervanging van een bepaalde hoeveelheid tekst in de buffer door een tekenreeks. De coördinaten en inhoud van elke bewerking worden uitgedrukt ten opzichte van de momentopname van de buffer toen de transactie werd gestart. Het ITextEdit object past de coördinaten aan van bewerkingen die worden beïnvloed door andere bewerkingen in dezelfde transactie.
Denk bijvoorbeeld aan een tekstbuffer die deze tekenreeks bevat:
abcdefghij
Pas een transactie toe die twee bewerkingen bevat, één bewerking die de spanwijdte op [2..4) vervangt door het teken X te gebruiken en een tweede bewerking die de spanwijdte op [6..9) vervangt door het teken Yte gebruiken. Het resultaat is deze buffer:
abXefYj
De coördinaten voor de tweede bewerking zijn berekend met betrekking tot de inhoud van de buffer aan het begin van de transactie, voordat de eerste bewerking werd toegepast.
De wijzigingen in de buffer worden van kracht wanneer het ITextEdit-object wordt doorgevoerd door zijn Apply()-methode aan te roepen. Als er ten minste één niet-lege bewerking is, wordt er een nieuwe ITextVersion gemaakt, wordt er een nieuwe ITextSnapshot gemaakt en wordt er één Changed gebeurtenis gegenereerd. Elke tekstversie heeft een andere momentopname van tekst. Een tekstmomentopname vertegenwoordigt de volledige status van de tekstbuffer na een bewerkingstransactie, maar in een tekstversie worden alleen de wijzigingen van de ene momentopname naar de volgende beschreven. In het algemeen zijn tekstsnapshots bedoeld om eenmaal te worden gebruikt en vervolgens verwijderd, terwijl tekstversies enige tijd beschikbaar moeten blijven.
Een tekstversie bevat een INormalizedTextChangeCollection. In deze verzameling worden de wijzigingen beschreven die, wanneer deze worden toegepast op de momentopname, de volgende momentopname produceren. Elke ITextChange in de verzameling bevat de tekenpositie van de wijziging, de vervangen tekenreeks en de vervangende tekenreeks. De vervangen tekenreeks is leeg voor een basisinvoeging en de vervangende tekenreeks is leeg voor een basisverwijdering. De genormaliseerde verzameling is altijd null voor de meest recente versie van de tekstbuffer.
Er kan op elk moment slechts één ITextEdit object worden geïnstantieerd voor een tekstbuffer en alle tekstbewerkingen moeten worden uitgevoerd op de thread die eigenaar is van de tekstbuffer (als het eigendom is geclaimd). Een tekstbewerking kan worden afgelaten door de Cancel methode of Dispose methode aan te roepen.
ITextBuffer biedt ook Insert(), Delete() en Replace() methoden die lijken op die gevonden in de ITextEdit interface. Het aanroepen van deze heeft hetzelfde effect als het maken van een ITextEdit object, het maken van een vergelijkbare aanroep en het toepassen van de bewerking.
Traceringspunten en traceringsbereiken
Een ITrackingPoint vertegenwoordigt een tekenpositie in een tekstbuffer. Als de buffer zodanig wordt bewerkt dat de positie van het teken wordt verschoven, verschuift het traceringspunt ermee. Als een traceringspunt bijvoorbeeld verwijst naar positie 10 in een buffer en er vijf tekens worden ingevoegd aan het begin van de buffer, verwijst het traceringspunt naar positie 15. Als een invoeging precies plaatsvindt op de positie die wordt aangegeven door het traceringspunt, wordt het gedrag ervan bepaald door PointTrackingMode, dat kan zijn Positive of Negative. Als de traceringsmodus positief is, verwijst het traceringspunt naar hetzelfde teken, dat zich nu aan het einde van de invoeging bevindt. Als de traceringsmodus negatief is, verwijst het traceringspunt naar het eerste ingevoegde teken op de oorspronkelijke positie. Als het teken op de positie die wordt vertegenwoordigd door een traceringspunt wordt verwijderd, verschuift het traceringspunt naar het eerste teken dat volgt op het verwijderde bereik. Als een traceringspunt bijvoorbeeld verwijst naar het teken op positie 5 en de tekens op positie 3 tot en met 6 worden verwijderd, verwijst het traceringspunt naar het teken op positie 3.
Een ITrackingSpan vertegenwoordigt een reeks tekens in plaats van slechts één positie. Het gedrag wordt bepaald door het SpanTrackingMode. Als de span-trackeringsmodus SpanTrackingMode.EdgeInclusive is, groeit het traceringsbereik om tekst op te nemen die aan de randen is toegevoegd. Als de bereikvolgmodus SpanTrackingMode.EdgeExclusive is, omvat het traceringsbereik geen tekst die aan de randen wordt ingevoegd. Als de spantrackingmodus echter SpanTrackingMode.EdgePositive is, pusht een invoeging de huidige positie naar het begin en als de spantrackingmodus SpanTrackingMode.EdgeNegative is, pusht een invoeging de huidige positie naar het einde.
U kunt de positie van een traceringspunt of het bereik van een traceringsspanne ophalen voor een momentopname van de tekstbuffer waartoe ze behoren. Er kan veilig naar traceringspunten en traceringsbereiken worden verwezen vanuit elke thread.
Soorten inhoud
Inhoudstypen zijn een mechanisme voor het definiëren van verschillende soorten inhoud. Een inhoudstype kan een bestandstype zijn, zoals 'tekst', 'code' of 'binair', of een technologietype zoals 'xml', 'vb' of 'c#'. Het woord 'using' is bijvoorbeeld een trefwoord in zowel C# als Visual Basic, maar niet in andere programmeertalen. Daarom is de definitie van dit trefwoord beperkt tot de inhoudstypen 'c#' en 'vb'.
Inhoudstypen worden gebruikt als filter voor decoraties en andere elementen van de editor. Veel editorfuncties en extensiepunten worden per inhoudstype gedefinieerd. Tekstkleuring is bijvoorbeeld anders voor tekstbestanden zonder opmaak, XML-bestanden en Visual Basic-broncodebestanden. Tekstbuffers worden over het algemeen een inhoudstype toegewezen wanneer ze worden gemaakt en het inhoudstype van een tekstbuffer kan worden gewijzigd.
Inhoudstypen kunnen meerdere overnames uitvoeren van andere inhoudstypen. Met ContentTypeDefinition kunt u meerdere basistypen opgeven als de ouders van een bepaald inhoudstype.
Ontwikkelaars kunnen hun eigen inhoudstypen definiëren en registreren met behulp van de IContentTypeRegistryService. Veel editorfuncties kunnen worden gedefinieerd met betrekking tot een specifiek inhoudstype met behulp van de ContentTypeAttribute. Editormarges, decoraties en muishandlers kunnen bijvoorbeeld worden gedefinieerd, zodat ze alleen van toepassing zijn op editors die bepaalde inhoudstypen weergeven.
De tekstweergave
Het weergavegedeelte van het MVC-patroon (Model View Controller) definieert de tekstweergave, de opmaak van de weergave, grafische elementen zoals de schuifbalk en de caret. Alle presentatie-elementen van de Visual Studio-editor zijn gebaseerd op WPF.
Tekstweergaven
De ITextView interface is een platformonafhankelijke weergave van een tekstweergave. Het wordt voornamelijk gebruikt om tekstdocumenten in een venster weer te geven, maar kan ook worden gebruikt voor andere doeleinden, bijvoorbeeld in knopinfo.
De tekstweergave verwijst naar verschillende soorten tekstbuffers. De TextViewModel eigenschap verwijst naar een ITextViewModel object dat verwijst naar deze drie verschillende tekstbuffers: de gegevensbuffer, de buffer op het hoogste gegevensniveau, de bewerkingsbuffer waarin bewerking plaatsvindt en de visuele buffer, de buffer die wordt weergegeven in de tekstweergave.
De tekst wordt opgemaakt op basis van de classificaties die zijn gekoppeld aan de onderliggende tekstbuffer en wordt verfraaid met behulp van de verfraaiingsproviders die zijn gekoppeld aan de tekstweergave zelf.
Het coördinaatsysteem van de tekstweergave
Het coördinaatsysteem van de tekstweergave specificeert posities in de tekstweergave. In dit coördinatensysteem komt de x-waarde 0,0 overeen met de linkerrand van de weergegeven tekst en komt de y-waarde 0,0 overeen met de bovenrand van de tekst die wordt weergegeven. De x-coördinaat neemt toe van links naar rechts en de y-coördinaat neemt van boven naar beneden toe.
Een viewport (het deel van de tekst dat zichtbaar is in het tekstvenster) kan niet op dezelfde manier horizontaal worden geschoven als verticaal wordt gescrold. Een viewport wordt horizontaal verschoven door de linkercoördinaat te wijzigen, zodat deze beweegt ten opzichte van het tekenoppervlak. Een viewport kan echter alleen verticaal worden gescrold door de weergegeven tekst te wijzigen, waardoor een LayoutChanged gebeurtenis wordt gegenereerd.
Afstanden in het coördinatensysteem komen overeen met logische pixels. Als het tekstweergaveoppervlak wordt weergegeven zonder een schaaltransformatie, komt één eenheid in het coördinaatsysteem voor tekstweergave overeen met één pixel op de weergave.
Marges
De ITextViewMargin interface vertegenwoordigt een marge en maakt het mogelijk om de zichtbaarheid van de marge en de grootte ervan te bepalen. Er zijn vier vooraf gedefinieerde marges, die de naam 'Boven', 'Links', 'Rechts' en 'Onder' hebben en zijn gekoppeld aan de boven-, onder-, linker- of rechterrand van een weergave. Deze marges zijn containers waarin andere marges kunnen worden geplaatst. De interface definieert methoden die de grootte van de marge en de zichtbaarheid van een marge retourneren. Marges zijn visuele elementen die aanvullende informatie bieden over de tekstweergave waaraan ze zijn gekoppeld. De marge voor regelnummers geeft bijvoorbeeld regelnummers weer voor de tekstweergave. In de marge van de glyph worden UI-elementen weergegeven.
De IWpfTextViewMarginProvider interface verwerkt het maken en plaatsen van marges. Marges kunnen worden gerangschikt met betrekking tot andere marges. Marges met een hogere prioriteit bevinden zich dichter bij de tekstweergave. Als er bijvoorbeeld twee linkermarges zijn, marge A en marge B, en marge B een lagere prioriteit heeft dan marge A, wordt marge B links van marge A weergegeven.
De host voor de tekstweergave
De IWpfTextViewHost interface bevat de tekstweergave en eventuele aangrenzende versieringen die bij de weergave horen, bijvoorbeeld schuifbalken. De host voor de tekstweergave bevat ook marges die zijn gekoppeld aan een rand van de weergave.
Opgemaakte tekst
De tekst die in een tekstweergave wordt weergegeven, bestaat uit ITextViewLine objecten. Elke tekstweergaveregel komt overeen met één regel tekst in de tekstweergave. Lange regels in de onderliggende tekstbuffer kunnen gedeeltelijk verborgen worden (als tekstterugloop niet is ingeschakeld) of opgesplitst in meerdere regels voor tekstweergave. De ITextViewLine interface bevat methoden en eigenschappen voor het in kaart brengen van de relatie tussen coördinaten en tekens, evenals voor de siertekens die aan de lijn kunnen worden gekoppeld.
ITextViewLine objecten worden gemaakt met behulp van een IFormattedLineSource interface. Als u zich alleen zorgen maakt over de tekst die momenteel in de weergave wordt weergegeven, kunt u de opmaakbron negeren. Als u geïnteresseerd bent in de opmaak van tekst die niet zichtbaar is in de weergave (bijvoorbeeld om knippen en plakken van tekst met opmaak te ondersteunen), kunt u IFormattedLineSource gebruiken om tekst in een tekstbuffer op te maken.
De tekstweergave formatteert één ITextSnapshotLine tegelijk.
Editorfuncties
De functies van de editor zijn zodanig ontworpen dat de definitie van de functie losstaat van de implementatie. De editor bevat de volgende functies:
Tags en classificeerders
Aanduidingen
Projection
Outlining
Muis- en sleutelbindingen
Bewerkingen en primitieven
IntelliSense
Tags en classificeerders
Tags zijn markeringen die zijn gekoppeld aan een reeks tekst. Ze kunnen op verschillende manieren worden weergegeven, bijvoorbeeld door tekstkleuring, onderstrepingen, afbeeldingen of pop-ups te gebruiken. Classificaties zijn één soort tag.
Andere soorten tags zijn TextMarkerTag voor tekstmarkeringen, OutliningRegionTag voor een overzicht en ErrorTag voor compilatiefouten.
Classificatietypen
Een IClassificationType interface vertegenwoordigt een gelijkwaardigheidsklasse, een abstracte categorie tekst. Classificatietypen kunnen meerdere overnames uitvoeren van andere classificatietypen. Programmeertaalclassificaties kunnen bijvoorbeeld 'trefwoord', 'opmerking' en 'id' bevatten, die allemaal overnemen van 'code'. Classificatietypen voor natuurlijke taal kunnen bestaan uit 'zelfstandig naamwoord', 'werkwoord' en 'bijvoeglijk naamwoord', die allemaal overnemen van 'natuurlijke taal'.
Classifications
Een classificatie is een exemplaar van een bepaald classificatietype, meestal over een reeks tekst. Een ClassificationSpan wordt gebruikt om een classificatie weer te geven. Een classificatiespanne kan worden beschouwd als een label dat een bepaalde tekstspanne bedekt en het systeem aangeeft dat deze tekstspanne van een bepaald classificatietype is.
Classificaties
Een IClassifier is een mechanisme waarmee tekst wordt opgesplitst in een set classificaties. Classificaties moeten worden gedefinieerd voor specifieke inhoudstypen en geïnstantieerd voor specifieke tekstbuffers. Cliënten moeten IClassifier implementeren om deel te nemen aan tekstclassificatie.
Classifier-aggregatoren
Een classificatieaggregator is een mechanisme waarmee alle classificaties voor één tekstbuffer worden gecombineerd tot slechts één set classificaties. Een C#-classificatie en een Engelse classificatie kunnen bijvoorbeeld classificaties maken voor een opmerking in een C#-bestand. Houd rekening met deze opmerking:
// This method produces a classifier
Een C#-classificatie kan het hele bereik labelen als een opmerking en de Engelse taalclassificatie classificeert mogelijk 'produceert' als een 'werkwoord' en 'methode' als een zelfstandig naamwoord. De aggregator produceert een set niet-overlappende classificaties en het type van de set is gebaseerd op alle bijdragen.
Een classificeerderaggregator is ook een classificeerder omdat deze tekst in een reeks classificaties verdeelt. De classificatieaggregator zorgt er ook voor dat er geen overlappende classificaties zijn en dat de classificaties worden gesorteerd. Afzonderlijke classificeerders zijn vrij om elke set classificaties, in elke volgorde en overlappend op welke manier dan ook, te retourneren.
Classificatieopmaak en tekstkleuring
Tekstopmaak is een voorbeeld van een functie die is gebaseerd op tekstclassificatie. Deze wordt gebruikt door de tekstweergavelaag om de weergave van tekst in een toepassing te bepalen. Het gebied voor tekstopmaak is afhankelijk van WPF, maar de logische definitie van classificaties niet.
Een classificatie-indeling is een set opmaakeigenschappen voor een specifiek classificatietype. Deze indelingen nemen over van de indeling van het bovenliggende type classificatie.
Een IClassificationFormatMap is een kaart van een classificatietype naar een set eigenschappen voor tekstopmaak. De implementatie van de formatmap in de editor verwerkt het exporteren van classificatieformats.
Aanduidingen
Decoraties zijn grafische effecten die niet rechtstreeks zijn gerelateerd aan het lettertype en de kleur van de tekens in de tekstweergave. De golvende rode onderstreping waarmee in veel programmeertalen niet-compilerende code wordt gemarkeerd, is bijvoorbeeld een ingesloten versiering, en tooltips zijn pop-upversieringen. Sierwerken zijn afgeleid van UIElement en implementeren ITag. Twee gespecialiseerde soorten versieringslabels zijn de SpaceNegotiatingAdornmentTag, voor decoraties die dezelfde ruimte innemen als de tekst in een weergave, en de ErrorTag, voor de golvende onderstreping.
Ingesloten versieringen zijn afbeeldingen die deel uitmaken van de opgemaakte tekstweergave. Ze zijn ingedeeld in verschillende Z-volgordelagen. Er zijn drie ingebouwde lagen: tekst, de caret en de selectie. Ontwikkelaars kunnen echter meer lagen definiëren en ze op volgorde plaatsen met betrekking tot elkaar. De drie soorten ingesloten versieringen zijn tekst-relatieve sierstukken (die worden verplaatst wanneer de tekst wordt verplaatst en worden verwijderd wanneer de tekst wordt verwijderd), weergave-relatieve versieringen (die te maken hebben met niet-tekstonderdelen van de weergave) en door de eigenaar beheerde versieringen (de ontwikkelaar moet de plaatsing beheren).
Pop-upversieringen zijn afbeeldingen die worden weergegeven in een klein venster boven de tekstweergave, bijvoorbeeld knopinfo.
Projection
Projectie is een techniek voor het samenstellen van een ander soort tekstbuffer die niet daadwerkelijk tekst opslaat, maar in plaats daarvan tekst uit andere tekstbuffers combineert. Een projectiebuffer kan bijvoorbeeld worden gebruikt om de tekst samen te stellen uit twee andere buffers en het resultaat weer te geven alsof deze zich in slechts één buffer bevindt of om delen van de tekst in één buffer te verbergen. Een projectiebuffer kan fungeren als een bronbuffer naar een andere projectiebuffer. Een set buffers die zijn gerelateerd aan projectie, kan op veel verschillende manieren worden samengesteld om tekst opnieuw te rangschikken. (Een dergelijke set wordt ook wel buffergrafiek genoemd.) De visual Studio-functie voor het weergeven van tekst wordt geïmplementeerd met behulp van een projectiebuffer om de samengevouwen tekst te verbergen en de Visual Studio-editor voor ASP.NET pagina's maakt gebruik van projectie ter ondersteuning van ingesloten talen zoals Visual Basic en C#.
IProjectionBuffer wordt gemaakt met behulp van IProjectionBufferFactoryService. Een projectiebuffer wordt vertegenwoordigd door een geordende reeks ITrackingSpan objecten die bronbereiken worden genoemd. De inhoud van deze reeksen wordt weergegeven als een reeks tekens. De tekstbuffers waaruit de bronbereiken worden getekend, worden bronbuffers genoemd. Clients van een projectiebuffer hoeven niet te weten dat deze verschilt van een gewone tekstbuffer.
De projectiebuffer luistert naar tekstwijzigingsgebeurtenissen op de bronbuffers. Wanneer de tekst in een bronspan verandert, worden de gewijzigde tekstcoördinaten naar de eigen coördinaten omgezet en worden de gepaste tekstwijzigingsgebeurtenissen gegenereerd. Denk bijvoorbeeld aan bronbuffers A en B met de volgende inhoud:
A: ABCDE
B: vwxyz
Als projectiebuffer P wordt gevormd uit twee tekstbereiken, één met alle buffer A en de andere met alle buffer B, heeft P de volgende inhoud:
P: ABCDEvwxyz
Als de subtekenreeks xy uit buffer B wordt verwijderd, genereert buffer P een gebeurtenis die aangeeft dat de tekens op positie 7 en 8 zijn verwijderd.
De projectiebuffer kan ook rechtstreeks worden bewerkt. Hiermee worden bewerkingen doorgegeven aan de juiste bronbuffers. Als bijvoorbeeld een tekenreeks wordt ingevoegd in buffer P op positie 6 (de oorspronkelijke positie van het teken 'v'), wordt de invoeging doorgegeven aan buffer B op positie 1.
Er gelden beperkingen voor de bronspanne die bijdragen aan een projectiebuffer. Bronbereiken mogen niet overlappen; een locatie in een projectiebuffer kan niet worden toegewezen aan meer dan één locatie in een bronbuffer en een locatie in een bronbuffer kan niet worden toegewezen aan meer dan één locatie in een projectiebuffer. Er zijn geen circulariteiten toegestaan in de bronbufferrelatie.
Gebeurtenissen worden gegenereerd wanneer de set van bronbuffers voor een projectiebuffer verandert en wanneer de set van bronsegmenten verandert. Een elisionbuffer is een speciaal soort projectiebuffer. Het wordt voornamelijk gebruikt voor het uitlijnen en voor bewerkingen waarmee tekstblokken worden uitgevouwen en samengevouwen. Een elisionbuffer is gebaseerd op slechts één bronbuffer en de spanten in de elisionbuffer moeten op dezelfde volgorde worden geplaatst als in de bronbuffer.
De buffergrafiek
De IBufferGraph interface maakt mapping mogelijk over een graf van projectiebuffers. Alle tekstbuffers en projectiebuffers worden verzameld in een gerichte acyclische grafiek, net zoals de abstracte syntaxisstructuur die wordt geproduceerd door een taalcompilator. De grafiek wordt gedefinieerd door de bovenste buffer, die elke tekstbuffer kan zijn. De buffergrafiek kan een punt in de bovenste buffer toewijzen aan een punt in een bronbuffer, of een segment in de bovenste buffer aan een set segmenten in een bronbuffer. Op dezelfde manier kan een punt of span van een bronbuffer worden toegewezen aan een punt in de bovenste buffer. Buffergrafieken worden gemaakt met behulp van de IBufferGraphFactoryService.
Gebeurtenissen en projectiebuffers
Wanneer een projectiebuffer wordt gewijzigd, worden de wijzigingen vanuit de projectiebuffer verzonden naar de buffers die hiervan afhankelijk zijn. Nadat alle buffers zijn gewijzigd, worden er bufferwijzigingsevenementen gegenereerd, te beginnen met de uiterste buffer.
Outlining
Een overzicht is de mogelijkheid om verschillende tekstblokken in een tekstweergave uit te vouwen of samen te vouwen. Een omlijning wordt gedefinieerd als een soort ITag, op dezelfde manier als decoraties worden gedefinieerd. Een OutliningRegionTag is een tag waarmee een tekstgebied wordt gedefinieerd dat kan worden uitgevouwen of samengevouwen. Als u een overzicht wilt gebruiken, moet u het IOutliningManagerService importeren om een IOutliningManager te krijgen. De uitgelijnde manager inventariseert, samenvouwt en breidt de verschillende blokken uit, die worden weergegeven als ICollapsible objecten en genereert gebeurtenissen dienovereenkomstig.
Muisbindingen
Muisbindingen koppelen muisbewegingen aan verschillende opdrachten. Muisbindingen worden gedefinieerd met behulp van een IMouseProcessorProvider, en sleutelbindingen worden gedefinieerd met behulp van een IKeyProcessorProvider. Hiermee worden IWpfTextViewHost automatisch alle bindingen geïnstantieerd en verbonden met muisevenementen in de weergave.
De IMouseProcessor interface bevat voorverwerkings- en naverwerkingsgebeurtenishandlers voor verschillende muisgebeurtenissen. Als u een van de gebeurtenissen wilt afhandelen, kunt u een aantal van de methoden in MouseProcessorBaseoverschrijven.
Bewerkingen van editor
Editorbewerkingen kunnen worden gebruikt om interactie met de editor te automatiseren voor scriptbewerkingen of andere doeleinden. U kunt de IEditorOperationsFactoryService importeren om bewerkingen uit te voeren op een bepaalde ITextView. U kunt deze objecten vervolgens gebruiken om de selectie te wijzigen, de weergave te schuiven of de caret naar verschillende delen van de weergave te verplaatsen.
IntelliSense
IntelliSense ondersteunt voltooiing van instructies, handtekeninghulp (ook wel parametergegevens genoemd), Snelle info en gloeilampen.
Voltooiing van code biedt pop-uplijsten met mogelijke voltooiingen voor methodenamen, XML-elementen en andere code- of markupelementen. Over het algemeen roept een gebruikersbeweging een voltooiingssessie aan. In de sessie wordt de lijst met mogelijke voltooiingen weergegeven en kan de gebruiker een lijst selecteren of de lijst sluiten. De ICompletionBroker is verantwoordelijk voor het maken en activeren van de ICompletionSession. De ICompletionSource berekent de CompletionSet voltooiingsonderdelen voor de sessie.
Problemen met importeren/exporteren oplossen: toegang krijgen tot het mef-samenstellingsfoutlogboek
Er kunnen problemen optreden als u iets probeert te importeren dat niet bestaat in de huidige VS-installatie of als u uw import- of export onjuist ontwerpt. De primaire manier om deze problemen te vinden en op te lossen, is om te verwijzen naar het foutenlogboek voor samenstelling van managed Extensibility Framework (MEF), opgeslagen op %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.