Condividi tramite


Nell'editor

L'editor è costituita da una serie di diversi sottosistemi, progettati per mantenere il modello di testo dell'editor separate dalla visualizzazione di testo e dall'interfaccia utente.

Queste sezioni vengono descritti gli aspetti diversi dell'editor:

Queste sezioni vengono descritte le funzionalità dell'editor:

Cenni preliminari sui sottosistemi

Il testo al sottosistema di modello

Il sottosistema del modello di testo è responsabile della rappresentazione di testo e di abilitare la modifica. Il sottosistema del modello di testo contiene l'interfaccia di ITextBuffer , che viene descritta la sequenza di caratteri che deve essere visualizzato dall'editor. Questo testo può essere modificato, tenere traccia di essere modificato in caso contrario in molti modi. Il modello di testo fornisce inoltre i tipi per i seguenti aspetti:

  • Un servizio che associa il testo con i file e gestisce la lettura e la scrittura del file system.

  • Un servizio di differenza che cerca le differenze minime tra due sequenze di oggetti.

  • Un sistema per la descrizione del testo in un buffer in termini di sottoinsiemi del testo in un buffer.

Il sottosistema del modello di testo è esente dai concetti (UI) dell'interfaccia utente. Ad esempio, non è responsabile della formattazione del testo o di layout di testo e non contiene alcuna informazione delle aree di controllo visivi che possono essere associati al testo.

I tipi pubblici dei sottosistemi del modello di testo sono contenuti in Microsoft.VisualStudio.Text.Data.dll e in Microsoft.VisualStudio.CoreUtilitiy.dll, che dipende solo dalla libreria di classi di base di .NET Framework e dall'estendibilità gestita Framework (MEF).

Sottosistema della visualizzazione di testo

Il sottosistema della visualizzazione di testo è responsabile della formattazione e di visualizzare il testo. I tipi in questo sottosistema sono divisi in due livelli, come se i tipi sono basate su Windows Presentation Foundation (WPF). I tipi più importanti sono ITextView e IWpfTextView, che controllano il set di righe di testo che devono essere visualizzati e anche il cursore, la selezione e le funzionalità per decorare il testo utilizzando gli elementi di interfaccia utente WPF. Questo sottosistema fornisce inoltre i margini intorno all'area di visualizzazione del testo. Tali margini possono essere estesi e possono contenere tipi diversi di contenuto e di effetti visivi. Esempi dei margini rappresentano visualizzazioni e barre di scorrimento del numero di riga.

I tipi pubblici dei sottosistemi della visualizzazione di testo sono contenuti in l Microsoft.VisualStudio.Text.UI.dl e Microsoft.VisualStudio.Text.UI.Wp f.dll. Il primo assembly contiene gli elementi dell'piattaforma-indipendente e il secondo contiene gli elementi WPF-specifici.

sottosistema di classificazione

Il sottosistema di classificazione è responsabile della definizione delle proprietà dei caratteri di testo. Un classificatore suddivide il testo in classi diverse, ad esempio, “la parola chiave„ o “nel commento„. Il mapping di formato di classificazione collega queste classi alle effettive proprietà del tipo di carattere, ad esempio, “Consolas blu 10 pinte„. Queste informazioni vengono utilizzate dalla visualizzazione di testo quando viene e eseguono il rendering del testo. Contrassegnare, come descritto in modo più dettagliato più avanti in questo argomento, consente ai dati per essere associato agli intervalli di testo.

I tipi pubblici dei sottosistemi di classificazione sono contenuti in Microsoft.VisualStudio.Text.Logic.dll e interagiscono con gli aspetti visivi di classificazione, contenute in Microsoft.VisualStudio.Text.UI.Wp f.dll.

Parametri [out] facoltativi

Il sottosistema di operazioni definisce il comportamento dell'editor. Fornisce l'implementazione per i controlli dell'editor di Visual Studio e il sistema di annullamento.

Attentamente al modello di testo e la visualizzazione di testo

Il modello di testo

Il sottosistema del modello di testo è costituito dai raggruppamenti dei tipi di testo. Questi includono il buffer di testo, gli snapshot di testo e gli intervalli di testo.

Buffer di testo e snapshot di testo

L'interfaccia di ITextBuffer rappresenta una sequenza di caratteri unicode che sono codificati utilizzando UTF-16, che rappresenta la codifica utilizzata da String tipi in .NET Framework. Un buffer di testo può essere mantenuto come documento di file system, ma ciò non è obbligatorio.

ITextBufferFactoryService viene utilizzato per creare un buffer di testo vuoto, o un buffer di testo che viene inizializzato da una stringa o da TextReader. Il buffer di testo possono essere resi persistenti nel file system come ITextDocument.

Il buffer di testo può essere modificato da qualsiasi thread fino a quando un thread non assume la proprietà del buffer di testo chiamando TakeThreadOwnership. Successivamente, solo il thread può eseguire modifiche.

Un buffer di testo può passare in più versioni nel corso della durata. Una nuova versione viene generata ogni volta che il buffer viene modificato e ITextSnapshot non modificabile rappresenta il contenuto di tale versione del buffer. Poiché gli snapshot di testo sono immutabili, è possibile accedere a uno snapshot di testo su qualsiasi thread, senza restrizioni, anche se il buffer di testo che rappresenta continua a essere modificato.

Snapshot di testo e linee di snapshot di testo

È possibile visualizzare il contenuto di uno snapshot di testo come una sequenza di caratteri o come una sequenza di linee. I caratteri e le righe sono entrambi avviare indicizzato a zero. Uno snapshot vuoto del testo contiene caratteri zero e una riga vuota. Una linea viene delimitata da qualsiasi sequenza valida del carattere di interruzione di riga Unicode, o dall'inizio o alla fine del buffer. I caratteri di interruzione di riga in modo esplicito sono rappresentati nello snapshot di testo e interruzioni di riga in uno snapshot di testo tutte non devono essere identici.

Nota

Per ulteriori informazioni sui caratteri di interruzione di riga nell'editor di Visual Studio, vedere Codifiche e interruzioni di riga.

Una riga di testo è rappresentata da un oggetto di ITextSnapshotLine , che può essere ottenuto da uno snapshot di testo per un numero di riga specifico o per una posizione di carattere specifico.

SnapshotPoints, SnapshotSpans e NormalizedSnapshotSpanCollections

SnapshotPoint rappresenta una posizione di carattere in uno snapshot. La posizione è garantito da rientrare tra zero e la lunghezza dello snapshot. SnapshotSpan rappresenta un intervallo di testo in uno snapshot. La posizione finale è garantito da rientrare tra zero e la lunghezza dello snapshot. NormalizedSnapshotSpanCollection è costituito da un set di oggetti di SnapshotSpan dello stesso snapshot.

Intervalli e NormalizedSpanCollections

Span rappresenta un intervallo che può essere applicato a un intervallo di testo in uno snapshot di testo. Le posizioni di snapshot sono in base zero, pertanto intervalli possono iniziare a qualsiasi posizione incluso zero. La proprietà di End di un intervallo è uguale alla somma della proprietà di Start e della proprietà di Length . Span non include il carattere che venga indicizzato dalla proprietà di End . Ad esempio, un intervallo che ha Start=5 e Length=3 ha End=8 e include i caratteri nelle posizioni 5, 6 e 7. La notazione per questo intervallo è 5..8).

Due intervalli si intersecano quando dispongono di posizioni in comune, inclusa la posizione finale. Di conseguenza, l'intersezione di [3, 5) e [2, 7) è [3, 5) e intersezione tra [3, 5) e [5, 7) è [5, 5). Si noti che [5, 5) è un intervallo vuoto.)

Due intervalli si sovrappongono se dispongono di posizioni in comune, ad eccezione della posizione finale. Un intervallo vuoto non si sovrappone mai altri intervalli e la sovrapposizione di due intervalli non è mai vuota.

NormalizedSpanCollection è un elenco di intervalli delle proprietà iniziale di intervalli. Nell'elenco, gli intervalli si sovrappongono o di intestature vengono unite. Ad esempio, in base al set di intervalli [5..9), [0..1), [3..6) e [9..10), nell'elenco normalizzato di intervalli è [0..1), [3..10).

ITextEdit, TextVersion e notifiche di modifica del testo

Il contenuto di un buffer di testo può essere modificato tramite un oggetto di ITextEdit . Creazione di un oggetto (utilizzando uno dei metodi di CreateEdit() di ITextBuffer) inizia una transazione di testo costituita dalle modifiche di testo. Ogni modifica è una sostituzione dell'intervallo di testo nel buffer da una stringa. Le coordinate e il contenuto di ogni modifica vengono espressi in relazione allo snapshot del buffer quando la transazione è stata avviata. L'oggetto di ITextEdit regola le coordinate delle modifiche interessate da altre modifiche nella stessa transazione.

Ad esempio, si consideri un buffer di testo che contiene questa stringa:

abcdefghij

Applicare una transazione che contiene due modifiche, una modifica che sostituisce intervallo [2..4) utilizzando il carattere X e una seconda modifica che sostituisce intervallo [6..9) utilizzando il carattere Y. Il risultato è il buffer:

abXefYj

Le coordinate della seconda modifica sono state elaborate rispetto al contenuto del bufferinizio della transazione, prima della prima modifica è applicasse.

Le modifiche al buffer hanno effetto quando l'oggetto di ITextEdit viene eseguito il commit chiamando il metodo di Apply() . Se fossero presenti almeno una modifica non vuota, nuovo ITextVersion viene creato, nuovo ITextSnapshot viene creato e un evento di Changed viene generato. Ogni versione di testo è uno snapshot diverso di testo. Snapshot di testo rappresenta lo stato completo del buffer di testo dopo che una transazione di modifica, ma una versione di testo vengono descritte solo le modifiche da uno snapshot all'altro. Gli snapshot di testo vengono utilizzati in genere per essere utilizzati una volta e quindi per essere rimossi, mentre le versioni di testo devono rimanere per un certo periodo di tempo attive.

una versione di testo contiene INormalizedTextChangeCollection. Questa raccolta vengono descritte le modifiche che, una volta applicate allo snapshot, verrà generato lo snapshot successivo. Ogni ITextChange nella raccolta contiene la posizione del carattere della modifica, la stringa sostituita e una stringa di sostituzione. La stringa viene sostituita è vuota per un inserimento di base e la stringa di sostituzione sia vuota per un'eliminazione di base. La raccolta normalizzata è sempre null per la versione più recente del buffer di testo.

Solo un oggetto di ITextEdit è possibile creare un'istanza di un buffer di testo in qualsiasi momento e tutte le modifiche di testo devono essere eseguite sul thread proprietario del buffer di testo (se la proprietà è stata reclamata). Una modifica del testo può essere abbandonato chiamando il metodo di Cancel o il relativo metodo di Dispose .

ITextBuffer fornisce inoltre Insert(), **Delete()**e i metodi di Replace() simili a quelli individuati in ITextEdit collegamento. Chiamare questi ha lo stesso effetto di creazione di un oggetto di ITextEdit , includendo la chiamata simile e quindi applicare la modifica.

Punti di rilevamento e intervalli di rilevamento

ITrackingPoint rappresenta una posizione di carattere in un buffer di testo. Se il buffer viene modificato in modo che determina la posizione del carattere nello scorrimento, il punto di rilevamento si sposta con. Ad esempio, se un punto di rilevamento si riferisce alla posizione 10 in un buffer e cinque caratteri vengono inseriti all'inizio del buffer, il punto di rilevamento quindi si riferiscono alla posizione 15. Se un inserimento si verifica con precisione nella posizione indicata dal punto di rilevamento, il comportamento è determinato dal PointTrackingMode, che possono essere Positive o Negative. Se la modalità di rilevamento non è positivo, il punto di rilevamento si riferisce allo stesso carattere, che si trova alla fine dell'inserimento; se la modalità di rilevamento è negativa, il punto di rilevamento si riferisce al primo carattere inserito nella posizione originale. Se il carattere nella posizione in cui è rappresentata da un punto di rilevamento viene eliminato, il punto di rilevamento si sposta al primo carattere che segue l'intervallo eliminato. Ad esempio, se un punto di rilevamento si riferisce al carattere nella posizione 5 e caratteri nelle posizioni da 3 a 6 vengono eliminati, il punto di rilevamento si riferisce al carattere nella posizione 3.

ITrackingSpan rappresenta un intervallo di caratteri anziché solo percorso. Il comportamento è determinato dal SpanTrackingMode. Se la modalità di rilevamento dell'intervallo è EdgeInclusive, l'intervallo di rilevamento diventa include il testo immesso i bordi; se la modalità di rilevamento dell'intervallo è EdgeExclusive, l'intervallo di rilevamento non include il testo inserito ai suoi limiti. Tuttavia, se la modalità di rilevamento dell'intervallo è EdgePositive, inserite di un inserimento nella posizione corrente verso l'inizio e la modalità di rilevamento EdgeNegativedell'intervallo, un inserimento richiesto la posizione corrente verso la fine.

È possibile ottenere la posizione di un punto di rilevamento o di un intervallo di rilevamento per tutti gli snapshot del buffer di testo a cui appartengono. I punti di rilevamento e intervalli di rilevamento possono essere fatto riferimento da qualsiasi thread.

tipi di contenuto

I tipi di contenuto sono un meccanismo per la definizione dei tipi diversi di contenuto. Un tipo di contenuto può essere un tipo di file come “testo„, “il codice„, o “il file binario„, o un tipo di tecnologia come “xml„, “VB„, o “c#„. Ad esempio, la parola “con„ è una parola chiave in c# e in Visual Basic, ma non in altri linguaggi di programmazione. Di conseguenza, la definizione di questa parola chiave è limitata ai tipi di contenuto VB “e„ di c#.

I tipi di contenuto vengono utilizzati come filtro per le aree di controllo e altri elementi dell'editor. Molte funzionalità e punti di estensione di editor sono definiti per il tipo di contenuto; ad esempio, la colorazione di testo è diversa per i file di testo normale, i file di codice sorgente di Visual Basic e dei file XML. I buffer di testo vengono assegnati in genere un tipo di contenuto quando vengono creati e il tipo di contenuto del buffer di testo può essere modificato.

I tipi di contenuto è multiplo-ereditare da altri tipi di contenuto. ContentTypeDefinition consente di specificare i tipi di base più come elementi padre di un tipo di contenuto specificato.

Gli sviluppatori possono definire propri tipi di contenuto e registrarli utilizzando IContentTypeRegistryService. Molte funzionalità dell'editor possono essere definite in relazione a un tipo di contenuto specifico utilizzando ContentTypeAttribute. Ad esempio, i margini dell'editor, gli attributi e i gestori del mouse possono essere definiti in modo che vengano applicate solo agli editor che visualizzano tipi di contenuto particolari.

La visualizzazione di testo

La parte del modello di visualizzazione di visualizzazione del (MVC) modello del controller definisce la visualizzazione di testo, la formattazione della visualizzazione, gli elementi grafici quali la barra di scorrimento e il cursore. Tutti gli elementi di presentazione dell'editor di Visual Studio sono basati su WPF.

Visualizzazioni di testo

L'interfaccia di ITextView è una rappresentazione dell'piattaforma-indipendente di una visualizzazione di testo. Viene utilizzata principalmente per visualizzare i documenti di testo in una finestra, ma può anche essere utilizzata per altri scopi, ad esempio, in una descrizione comando.

La visualizzazione di testo fare riferimento ai diversi tipi di buffer di testo. La proprietà di TextViewModel fa riferimento a un oggetto di ITextViewModel che indica questi tre buffer di testo diversi: il buffer di dati, ovvero del buffer livello di dati superiore, il buffer di modifica, in cui modificare si verifica e il buffer visivo, ovvero il buffer visualizzato nella visualizzazione di testo.

Il testo viene formattato in base ai classificatori associati al buffer di testo sottostante e viene decorato tramite i provider dell'area di controllo associati alla visualizzazione di testo stessa.

Il sistema di coordinate della visualizzazione di testo

Il sistema di coordinate della visualizzazione di testo specifica le posizioni nella visualizzazione di testo. In tale sistema di coordinate, il valore 0,0 di x corrisponde a sinistra bordo del testo che viene visualizzato e il valore 0,0 di y corrisponde al bordo superiore del testo visualizzato. Coordinata di x aumenta da sinistra a destra e la coordinata di y aumenta dall'alto verso il basso.

Un riquadro di visualizzazione (la parte del testo visibile nella finestra di testo non è possibile scorrere allo stesso modo orizzontale quando si scorre verticalmente. Un riquadro di visualizzazione si scorre orizzontalmente modificando la coordinata di sinistra in modo che viene spostato rispetto all'area di disegno. Tuttavia, un riquadro di visualizzazione è possibile scorrere verticalmente unicamente modificando il testo di cui è stato eseguito il rendering, che genera un evento di LayoutChanged a essere generato.

Le distanze nel sistema di coordinate corrispondono ai pixel logici. Se la superficie di rendering del testo visualizzato senza una trasformazione di scala, quindi un'unità nel sistema di coordinate del rendering del testo corrisponde a un pixel della visualizzazione.

Margini

L'interfaccia di ITextViewMargin rappresenta un margine e consente il controllo della visibilità del margine e la relativa dimensione. Esistono quattro margini predefiniti, denominati “l„, “a sinistra„, “right„ e “fondo„ e sono associati all'inizio, a inferiore, sinistro, o al bordo destro di una visualizzazione. I margini sono contenitori nei quali altri margini possono essere posizionati. L'interfaccia definisce i metodi che restituiscono la dimensione del margine e la visibilità di un margine. I margini sono elementi visivi che forniscono informazioni aggiuntive sulla visualizzazione di testo a cui sono associati. Ad esempio, il margine del numero di riga visualizzati i numeri di riga per la visualizzazione di testo. Il margine del glifo per visualizzare gli elementi di interfaccia utente.

L'interfaccia di IWpfTextViewMarginProvider gestisce la creazione e la posizione dei margini. I margini possono essere ordinati rispetto ad altri margini. I margini con priorità più elevata si trovano più vicino alla visualizzazione di testo. Ad esempio, se esistono due margini lasciati, marginano Su e marginano B e margine B ha una priorità più bassa che marginare Su, il margine B viene visualizzato a sinistra del margine A.

L'host della visualizzazione di testo

L'interfaccia di IWpfTextViewHost contiene la visualizzazione di testo e tutte le decorazioni adiacenti associati alla visualizzazione, ad esempio, barre di scorrimento. L'host della visualizzazione di testo contiene anche i margini associati a un bordo della visualizzazione.

testo formattato

Il testo visualizzato in una visualizzazione di testo è composto da oggetti di ITextViewLine . Ogni riga della visualizzazione di testo corrisponde a una riga di testo nella visualizzazione di testo. Lunghe righe nel buffer di testo sottostante è parzialmente essere attivata (se il wrapping di parola non è attivato o suddiviso in più righe della visualizzazione di testo. L'interfaccia di ITextViewLine contiene i metodi e le proprietà per eseguire il mapping tra le coordinate e i caratteri e per le aree di controllo che possono essere associati alla riga.

gli oggetti diITextViewLine vengono creati utilizzando un'interfaccia di IFormattedLineSource . Se si è interessati solo sul testo visualizzato correntemente nella visualizzazione, è possibile ignorare l'origine di formattazione. Se è necessario il formato di testo non visualizzati nella visualizzazione (ad esempio, per supportare un taglia e incolla di Rich), è possibile utilizzare IFormattedLineSource per formattare il testo in un buffer di testo.

La visualizzazione di testo formatta un ITextSnapshotLine per volta.

Funzionalità dell'editor

Le funzionalità dell'editor sono progettate in modo che la definizione della funzionalità sia separato dall'implementazione. L'editor include le funzionalità seguenti:

  • tag e classificatori

  • Aree di controllo

  • Projection

  • Struttura

  • Il mouse e tasti di scelta rapida

  • operazioni e primitive

  • IntelliSense

tag e classificatori

I tag sono marcatori associati a un intervallo di testo. Possono essere presentati in diversi modi, ad esempio, utilizzando la colorazione di testo, sottolineature, grafica, o popup. i classificatori sono un tipo di tag.

Altri tipi di tag sono TextMarkerTag per l'evidenziazione di testo, OutliningRegionTag per la descrizione e ErrorTag per gli errori di compilazione.

tipi di classificazione

un'interfaccia di IClassificationType rappresenta una classe di equivalenza, che è una categoria astratta di testo. i tipi di classificazione possono multiplo-ereditare da altri tipi di classificazione. Ad esempio, le classificazioni di linguaggio di programmazione possono includere “parola chiave„, “commento„ e “identificatore„, che ereditano tutte “dal codice. I tipi di classificazione di linguaggio naturale possono includere “nome„, “il verbo„ e “definizione "„, che tutti ereditare “dal linguaggio naturale„.

Classificazioni

Una classificazione è un'istanza di un determinato tipo di classificazione, in genere in un intervallo di testo. ClassificationSpan viene utilizzato per rappresentare una classificazione. Un intervallo di classificazione può essere considerata un'alternativa all'etichetta che riguarda un intervallo specifico di testo e fornisce al sistema che si riferisce l'intervallo di testo di un determinato tipo di classificazione.

classificatori

IClassifier è un meccanismo che interrompe il testo in un set di classificazioni. I classificatori devono essere definiti per i tipi di contenuto specifici e possibile creare un'istanza per i buffer di testo specifici. I client devono implementare IClassifier per partecipare alla classificazione di testo.

aggregatori di classificatore

Un aggregatore di classificatore è un meccanismo che combina tutti i classificatori per un buffer di testo in una serie di classificazione. Ad esempio, di un classificatore c# che un classificatore in lingua inglese è possibile creare le classificazioni su un commento in un file c#. Si consideri il commento:

// This method produces a classifier

Un classificatore c# possibile contrassegnare l'intera ampiezza come commento e il classificatore in lingua inglese possibile classificare “genera„ come un verbo„ e “metodo„ as “nome„. L'aggregatore produce un set di classificazioni non sovrapposti e il tipo di è basato su tutti i contributi.

Un aggregatore di classificatore è anche un classificatore perché suddivide il testo in un set di classificazioni. Aggregatore di classificatore garantisce che non esistono classificazioni sovrapposte e che le classificazioni vengono ordinate. I singoli classificatori sono liberi di restituire qualsiasi set di classificazioni, in qualsiasi ordine e in sovrapporsi in alcun modo.

Formattazione di classificazione e colorazione del testo

La formattazione del testo è un esempio di una funzionalità compilata nella classificazione di testo. Viene utilizzato dal livello della visualizzazione di testo per determinare la visualizzazione di testo in un'applicazione. L'area di formattazione del testo dipende da WPF, ma la definizione logica delle classificazioni non è.

Un formato di classificazione è un set di proprietà di formattazione per uno specifico tipo di classificazione. Questi formati ereditano dal formato del padre del tipo di classificazione.

IClassificationFormatMap è un mapping da un tipo di classificazione a un set di proprietà di formattazione del testo. L'implementazione del mapping di formato nell'editor gestisce tutte le esportazioni di formati di classificazione.

Aree di controllo

Gli attributi sono effetti grafici non direttamente correlati al tipo di carattere e il colore dei caratteri nella visualizzazione di testo. Ad esempio, il carattere di sottolineatura rossa di linee a zigzag utilizzata per contrassegnare non compilare il codice in molti linguaggi di programmazione è un'area di controllo incorporato e le descrizioni comandi è aree di controllo popup. Gli attributi sono derivati da UIElement e implementano ITag. Due tipi specializzati di tag area sono SpaceNegotiatingAdornmentTag, per le aree di controllo che occupano lo stesso spazio del testo in una visualizzazione e ErrorTag, per la sottolineatura di linee a zigzag.

Gli attributi predefiniti sono immagini che fanno parte della visualizzazione di testo formattato. Sono organizzati in diversi livelli dell'ordine Z. Esistono tre livelli incorporati, come segue: il testo su, il cursore e la selezione. However, developers can define more layers and put them in order with respect to one another. I tre tipi di area di controllo incorporato sono aree di controllo del testo-parente (che consente di spostarsi quando il testo viene spostato e vengono eliminati quando il testo viene eliminato), aree di controllo del visualizzazione-parente (relativi alle parti non di testo dello schermo) e alle aree archiviati al proprietario (lo sviluppatore deve mantenere la posizione).

Le aree di controllo popup sono elementi grafici visualizzati in una piccola finestra sopra la visualizzazione di testo, ad esempio, descrizioni comandi.

Projection

La proiezione è una tecnica per la costruzione di tipo diverso con buffer di testo che non archiviare il testo, ma le associazioni di testi da altri buffer di testo. Ad esempio, un buffer di proiezione può essere utilizzato per concatenare il testo da altri due buffer e per visualizzare il risultato come se fosse in un solo buffer, o per nascondere parti del testo in un buffer. Un buffer di proiezione può fungere da un buffer di origine a un altro buffer di proiezione. Un set di buffer correlati dalla proiezione può essere creato per ridisporre il testo in molti modi diversi. (Tale set è anche nota come un grafico del buffer.) La modalità struttura del testo di Visual Studio viene implementata tramite un buffer di proiezione per nascondere il testo compresso e l'editor di Visual Studio per le pagine ASP.NET utilizza la proiezione per supportare i linguaggi incorporati quali Visual Basic e c#.

IProjectionBuffer viene creato utilizzando IProjectionBufferFactoryService. Un buffer di proiezione è rappresentato da una sequenza di oggetti ordinata di ITrackingSpan che sono noti come intervalli di origine. Il contenuto di questi intervalli viene presentato come sequenza di caratteri. I buffer di testo che gli intervalli di origine sono tirate sono denominati buffer di origine. I client di IVsHiddenTextSession visualizzeranno solo le aree della struttura che sono stati aggiunti utilizzando AddHiddenRegions o AddHiddenRegionsEx.

Il buffer di proiezione è in ascolto di eventi di testo-modifica sui buffer di origine. Quando il testo nell'origine di un intervallo, il buffer di proiezione esegue il mapping delle coordinate modifica del testo al relativo le proprie coordinate e l'oggetto che genera o gli eventi di testo-modifica. Ad esempio, considerare i buffer A e B di origine che hanno questo contenuto:

A: ABCDE
B: vwxyz

Se il buffer P di proiezione è composto da due intervalli di testo, uno che presenta del buffer Su e l'altro che disponga di qualsiasi buffer B, quindi P presenta il contenuto seguente:

P: ABCDEvwxyz

Se la sottostringa xy verrà eliminato dal buffer B, quindi il buffer P genera un evento che indica che i caratteri nelle posizioni 7 e 8 sono stati eliminati.

Il buffer di proiezione può anche essere modificato direttamente. Propaga le modifiche ai buffer di origine appropriati. Ad esempio, se una stringa viene inserita nel buffer P nella posizione 6 (la posizione originale del carattere “v„), l'inserimento viene propagato per la memorizzazione nel buffer B nella posizione 1.

Esistono restrizioni sugli intervalli di origine che contribuiscono a un buffer di proiezione. Gli intervalli di origine non possono sovrapporsi, una posizione in un buffer di proiezione non è possibile eseguire il mapping a una posizione in un buffer di origine e una posizione in un buffer di origine non può eseguire il mapping a una posizione in un buffer di proiezione. Non esistono circolarità consentite nella relazione originale del buffer.

Gli eventi vengono generati quando il set di buffer di origine per un buffer di proiezione e quando il set di database di origine va le modifiche.

Un buffer di elisione è un tipo speciale di buffer di proiezione. Viene utilizzata principalmente per la descrizione e per le operazioni che consentono di espandere e comprimere blocchi di testo. Un buffer di elisione è basato su un solo buffer di origine e gli intervalli nel buffer di elisione devono essere ordinate lo stesso modo in cui vengano ordinate nel buffer di origine.

Il grafico del buffer

L'interfaccia di IBufferGraph eseguire il mapping tramite un grafico di buffer di proiezione. Tutti i buffer di testo e buffer di proiezione sono raccolti in un grafico aciclico diretto, come la struttura ad albero sintattica astratta che viene prodotta da un compilatore di linguaggio. Il grafico viene definito dal buffer superiore, che può essere qualsiasi buffer di testo. Il grafico del buffer possibile eseguire il mapping da un punto nel buffer superiore a un punto in un buffer di origine, o da un intervallo nel buffer superiore a un set di intervalli in un buffer di origine. Analogamente, è possibile eseguire il mapping di un punto o un intervallo da un buffer di origine in un punto nel buffer superiore. I grafici del buffer vengono creati utilizzando IBufferGraphFactoryService.

Eventi e buffer di proiezione

Quando un buffer di proiezione viene modificato, le modifiche inviate dal buffer di proiezione ai buffer che dipendono da. Dopo tutti i buffer vengono modificati, eventi di modifica del buffer vengono generati, a partire dal buffer più profondo.

Struttura

La struttura consente di espandere o comprimere blocchi di testo diversi in una visualizzazione di testo. La struttura è definita come tipo di ITag, come gli attributi definiti. OutliningRegionTag è un tag che definisce un'area di testo che può essere espansa o compressa. Per utilizzare la struttura, è necessario includere IOutliningManagerService per ottenere IOutliningManager. Il gestore della struttura enumera, compresso ed espandere i blocchi diversi, rappresentati come oggetti di ICollapsible e genera eventi di conseguenza.

Associazioni del mouse

Le associazioni del mouse collega i movimenti del mouse comandi diversi. Le associazioni del mouse è definita tramite IMouseProcessorProvidere le combinazioni di tasti sono definite tramite IKeyProcessorProvider. IWpfTextViewHost viene creata automaticamente un'istanza di tutte le associazioni e le connette agli eventi del mouse nella visualizzazione.

L'interfaccia di IMouseProcessor contiene preelabora e gestori eventi successivi al processo per gli eventi del mouse diversi. Per gestire uno degli eventi, è possibile eseguire l'override di alcuni dei metodi in MouseProcessorBase.

Operazioni dell'editor

Le operazioni dell'editor possono essere utilizzate per automatizzare l'interazione con l'editor, per gli script o altri scopi. È possibile importare IEditorOperationsFactoryService alle operazioni di accesso in ITextViewspecificato. È quindi possibile utilizzare questi oggetti per modificare la selezione, per scorrere la visualizzazione, o per spostare il cursore su parti diverse della visualizzazione.

IntelliSense

IntelliSense supporta completamento delle istruzioni, supporto firma (denominata anche informazioni sul parametro), informazioni rapide e smart tag.

Il completamento delle istruzioni vengono forniti elenchi popup di completamenti potenziali dei nomi del metodo, elementi XML e altri codifica o elementi di markup. Un'azione utente viene in genere una sessione di completamento. La sessione visualizzare l'elenco di completamenti potenziali e l'utente può selezionare una o chiudere l'elenco. ICompletionBroker è responsabile della creazione e dell'attivazione ICompletionSession. ICompletionSource calcola CompletionSet degli elementi di completamento della sessione.

Vedere anche

Concetti

Punti di estensione di editor

Importazioni dell'editor