Body rozšíření služby jazyka a editoru
Editor poskytuje rozšiřující body, které můžete rozšířit jako součásti meF (Managed Extensibility Framework), včetně většiny funkcí jazykové služby. Toto jsou hlavní kategorie bodů rozšíření:
Typy obsahu
Typy klasifikace a formáty klasifikace
Okraje a posuvníky
Značky
Ozdoby
Procesory myši
Obslužné rutiny přetažení
Možnosti
IntelliSense
Rozšíření typů obsahu
Typy obsahu jsou definice typů textu zpracovávaných editorem, například "text", "code" nebo "CSharp". Nový typ obsahu definujete deklarací proměnné typu ContentTypeDefinition a zadáním nového typu obsahu jedinečný název. Pokud chcete typ obsahu zaregistrovat v editoru, exportujte ho společně s následujícími atributy:
NameAttribute je název typu obsahu.
BaseDefinitionAttribute je název typu obsahu, ze kterého je tento typ obsahu odvozen. Typ obsahu může dědit z více dalších typů obsahu.
ContentTypeDefinition Protože je třída zapečetěná, můžete ji exportovat bez parametru typu.
Následující příklad ukazuje atributy exportu v definici typu obsahu.
[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;
Typy obsahu můžou být založené na nule nebo více existujících typech obsahu. Toto jsou předdefinované typy:
Libovolná: základní typ obsahu. Nadřazený prvek všech ostatních typů obsahu
Text: základní typ pro neprojekční obsah. Dědí z "any".
Prostý text: pro nekódovaný text. Dědí z textu.
Kód: pro kód všech druhů. Dědí z textu.
Inert: vyloučí text z jakéhokoli druhu zpracování. Text tohoto typu obsahu nikdy nebude mít žádné rozšíření použité.
Projekce: pro obsah vyrovnávací paměti projekce. Dědí z "any".
IntelliSense: pro obsah technologie IntelliSense. Dědí z textu.
Sighelp: nápověda k podpisu. Dědí z intellisense.
Sighelp-doc: Dokumentace nápovědy k podpisu Dědí z intellisense.
Toto jsou některé typy obsahu definované sadou Visual Studio a některé jazyky hostované v sadě Visual Studio:
Basic
C/C++
ConsoleOutput
CSharp
CSS
ENC
FindResults
F#
HTML
JScript
XAML
XML
Pokud chcete zjistit seznam dostupných typů obsahu, naimportujte IContentTypeRegistryServicesoubor , který udržuje kolekci typů obsahu pro editor. Následující kód naimportuje tuto službu jako vlastnost.
[Import]
internal IContentTypeRegistryService ContentTypeRegistryService { get; set; }
Chcete-li přidružit typ obsahu k příponě názvu souboru, použijte FileExtensionToContentTypeDefinition.
Poznámka:
V sadě Visual Studio se přípony názvů souborů registrují pomocí ProvideLanguageExtensionAttribute balíčku jazykové služby. Přidruží FileExtensionToContentTypeDefinition typ obsahu MEF k příponě názvu souboru, která byla tímto způsobem zaregistrována.
Chcete-li exportovat příponu názvu souboru do definice typu obsahu, musíte zahrnout následující atributy:
FileExtensionAttribute: určuje příponu názvu souboru.
ContentTypeAttribute: určuje typ obsahu.
FileExtensionToContentTypeDefinition Protože je třída zapečetěná, můžete ji exportovat bez parametru typu.
Následující příklad ukazuje atributy exportu přípony názvu souboru do definice typu obsahu.
[Export]
[FileExtension(".test")]
[ContentType("test")]
internal static FileExtensionToContentTypeDefinition TestFileExtensionDefinition;
Spravuje IFileExtensionRegistryService přidružení mezi příponami názvů souborů a typy obsahu.
Rozšíření typů klasifikace a formátů klasifikace
Typy klasifikace můžete použít k definování typů textu, pro které chcete poskytnout jiné zpracování (například barevné obarvení textu "klíčové slovo" modrým a zeleným textem "komentář"). Definujte nový typ klasifikace deklarací proměnné typu ClassificationTypeDefinition a zadáním jedinečného názvu.
Pokud chcete typ klasifikace zaregistrovat v editoru, exportujte ho společně s následujícími atributy:
NameAttribute: název typu klasifikace.
BaseDefinitionAttribute: název typu klasifikace, ze kterého tento typ klasifikace dědí. Všechny typy klasifikace dědí z textu a typ klasifikace může dědit z více dalších typů klasifikace.
ClassificationTypeDefinition Protože je třída zapečetěná, můžete ji exportovat bez parametru typu.
Následující příklad ukazuje export atributů v definici typu klasifikace.
[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;
Poskytuje IStandardClassificationService přístup ke standardním klasifikacm. Mezi předdefinované typy klasifikace patří:
"text"
"přirozený jazyk" (odvozuje se z textu)
"formální jazyk" (odvozuje se z textu)
"string" (odvozuje se z literálu)
"character" (odvozuje se z literálu)
"numeric" (odvozuje se z literálu)
Sada různých typů chyb dědí z ErrorTypeDefinition. Zahrnují následující typy chyb:
Chyba syntaxe
Chyba kompilátoru
"Jiná chyba"
"upozornění"
Pokud chcete zjistit seznam dostupných typů klasifikace, importujte IClassificationTypeRegistryServicesoubor , který udržuje kolekci typů klasifikace pro editor. Následující kód naimportuje tuto službu jako vlastnost.
[Import]
internal IClassificationTypeRegistryService ClassificationTypeRegistryService { get; set; }
Pro nový typ klasifikace můžete definovat definici formátu klasifikace. Odvození třídy z ClassificationFormatDefinition a jeho export s typem EditorFormatDefinitionspolu s následujícími atributy:
NameAttribute: název formátu.
DisplayNameAttribute: zobrazovaný název formátu.
UserVisibleAttribute: Určuje, zda se formát zobrazí na stránce Písma a barvy dialogového okna Možnosti .
OrderAttribute: priorita formátu. Platné hodnoty jsou z Priority.
ClassificationTypeAttribute: název typu klasifikace, na který je tento formát mapován.
Následující příklad ukazuje atributy exportu v definici formátu klasifikace.
[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "test")]
[Name("test")]
[DisplayName("Test")]
[UserVisible(true)]
[Order(After = Priority.Default, Before = Priority.High)]
internal sealed class TestFormat : ClassificationFormatDefinition
Pokud chcete zjistit seznam dostupných formátů, importujte IEditorFormatMapServicesoubor , který udržuje kolekci formátů editoru. Následující kód naimportuje tuto službu jako vlastnost.
[Import]
internal IEditorFormatMapService FormatMapService { get; set; }
Rozšíření okrajů a posuvníků
Okraje a posuvníky jsou hlavními prvky zobrazení editoru kromě samotného textového zobrazení. Kromě standardních okrajů, které se zobrazí kolem textového zobrazení, můžete zadat libovolný počet okrajů.
IWpfTextViewMargin Implementujte rozhraní pro definování okraje. K vytvoření okraje musíte také implementovat IWpfTextViewMarginProvider rozhraní.
Pokud chcete zaregistrovat poskytovatele okrajů v editoru, musíte poskytovatele exportovat společně s následujícími atributy:
NameAttribute: název okraje.
OrderAttribute: pořadí, ve kterém se okraj zobrazuje vzhledem k ostatním okrajům.
Toto jsou předdefinované okraje:
"Wpf Horizontal Scrollbar"
"Wpf Vertical Scrollbar"
"Wpf Line Number Margin"
Vodorovné okraje s atributem
After="Wpf Horizontal Scrollbar"
pořadí jsou zobrazeny pod předdefinovaným okrajem a vodorovné okraje s atributemBefore ="Wpf Horizontal Scrollbar"
pořadí jsou zobrazeny nad předdefinovaným okrajem. Pravé svislé okraje, které mají atributAfter="Wpf Vertical Scrollbar"
pořadí, jsou zobrazeny vpravo od posuvníku. Levé svislé okraje, které mají atributAfter="Wpf Line Number Margin"
pořadí, se zobrazí vlevo od okraje čísla řádku (pokud je viditelný).
MarginContainerAttribute: druh okraje (levý, pravý, horní nebo dolní).
ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), pro který je okraj platný.
Následující příklad ukazuje atributy exportu na zprostředkovateli okrajů pro okraj, který se zobrazí vpravo od čáry číslování okrajů.
[Export(typeof(IWpfTextViewMarginProvider))]
[Name("TestMargin")]
[Order(Before = "Wpf Line Number Margin")]
[MarginContainer(PredefinedMarginNames.Left)]
[ContentType("text")]
Rozšíření značek
Značky představují způsob přidružení dat k různým druhům textu. V mnoha případech se přidružená data zobrazují jako vizuální efekt, ale ne všechny značky mají vizuální prezentaci. Vlastní druh značky můžete definovat implementací ITag. Musíte také implementovat ITagger<T> , abyste zadali značky pro danou sadu rozsahů textu a ITaggerProvider poskytli tagger. Zprostředkovatele taggeru musíte exportovat společně s následujícími atributy:
ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), pro který je značka platná.
TagTypeAttribute: druh značky.
Následující příklad ukazuje atributy exportu u poskytovatele taggeru.
<CodeContentPlaceHolder>8 Následující druhy značek jsou integrované:
ClassificationTag: přidruženo k objektu IClassificationType.
ErrorTag: přidružené k typům chyb.
TextMarkerTag: přidružené k doplňku.
Poznámka:
Příklad TextMarkerTagdefinice HighlightWordTag v návodu: Zvýraznění textu.
OutliningRegionTag: přidružené k oblastem, které je možné rozbalit nebo sbalit v osnově.
SpaceNegotiatingAdornmentTag: definuje prostor, který doplněk zabírá v textovém zobrazení. Další informace o ozdobných doplňkech pro jednání o prostoru najdete v následující části.
IntraTextAdornmentTag: poskytuje automatické mezery a změnu velikosti doplňku.
Pokud chcete vyhledat a použít značky pro vyrovnávací paměti a zobrazení, naimportujte nebo použijte IViewTagAggregatorFactoryService IBufferTagAggregatorFactoryServiceznačky, které vám ITagAggregator<T> poskytnou požadovaný typ. Následující kód naimportuje tuto službu jako vlastnost.
[Import]
internal IViewTagAggregatorFactoryService ViewTagAggregatorFactoryService { get; set; }
Značky a MarkerFormatDefinitions
Třídu můžete rozšířit MarkerFormatDefinition tak, aby definovala vzhled značky. Třídu (jako EditorFormatDefinition)musíte exportovat s následujícími atributy:
NameAttribute: název použitý pro odkaz na tento formát
UserVisibleAttribute: To způsobí, že se formát zobrazí v uživatelském rozhraní.
V konstruktoru definujete zobrazovaný název a vzhled značky. BackgroundColor definuje barvu výplně a ForegroundColor definuje barvu ohraničení. Jedná se DisplayName o lokalizovatelný název definice formátu.
Následuje příklad definice formátu:
[Export(typeof(EditorFormatDefinition))]
[Name("MarkerFormatDefinition/HighlightWordFormatDefinition")]
[UserVisible(true)]
internal class HighlightWordFormatDefinition : MarkerFormatDefinition
{
public HighlightWordFormatDefinition()
{
this.BackgroundColor = Colors.LightBlue;
this.ForegroundColor = Colors.DarkBlue;
this.DisplayName = "Highlight Word";
this.ZOrder = 5;
}
}
Chcete-li použít tuto definici formátu na značku, odkazujte na název, který jste nastavili v atributu name třídy (nikoli zobrazovaný název).
Poznámka:
MarkerFormatDefinitionPříklad , viz HighlightWordFormatDefinition třída Návod: Zvýraznění textu.
Rozšíření doplňků
Doplňky definují vizuální efekty, které lze přidat buď do textu zobrazeného v textovém zobrazení, nebo do samotného textového zobrazení. Můžete definovat vlastní doplňková doplňková zařízení jako jakýkoli typ UIElement.
Ve třídě doplňku musíte deklarovat .AdornmentLayerDefinition Pokud chcete zaregistrovat vrstvu doplňku, exportujte ji společně s následujícími atributy:
NameAttribute: název doplňku.
OrderAttribute: řazení ozdobného doplňku s ohledem na jiné vrstvy doplňku. Třída PredefinedAdornmentLayers definuje čtyři výchozí vrstvy: Výběr, Osnova, Stříška a Text.
Následující příklad ukazuje export atributů v definici vrstvy adornment.
[Export]
[Name("TestEmbeddedAdornment")]
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]
internal AdornmentLayerDefinition testLayerDefinition;
Je nutné vytvořit druhou třídu, která implementuje IWpfTextViewCreationListener a zpracovává její TextViewCreated událost vytvořením instance doplňku. Tuto třídu musíte exportovat společně s následujícími atributy:
ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), pro který je doplněk platný.
TextViewRoleAttribute: druh textového zobrazení, pro které je toto doplňování platné. Třída PredefinedTextViewRoles má sadu předdefinovaných rolí zobrazení textu. Například Document se primárně používá pro textová zobrazení souborů. Interactive se používá pro textová zobrazení, která uživatel může upravovat nebo procházet pomocí myši a klávesnice. Interactive Příklady zobrazení jsou textové zobrazení editoru a okno Výstup.
Následující příklad ukazuje atributy exportu u zprostředkovatele doplňku.
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("csharp")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TestAdornmentProvider : IWpfTextViewCreationListener
Doplňková ozdoba pro vyjednávání prostoru je ta, která zabírá prostor na stejné úrovni jako text. Chcete-li vytvořit tento druh doplňku, je nutné definovat třídu značky, která dědí z SpaceNegotiatingAdornmentTag, která definuje množství místa, které doplňková ozdoba zabírá.
Stejně jako u všech doplňků musíte exportovat definici vrstvy doplňku.
[Export]
[Name("TestAdornment")]
[Order(After = DefaultAdornmentLayers.Text)]
internal AdornmentLayerDefinition testAdornmentLayer;
Chcete-li vytvořit instanci doplňku prostor-vyjednávání, musíte vytvořit třídu, která implementuje ITaggerProvider, kromě třídy, která implementuje IWpfTextViewCreationListener (stejně jako u jiných druhů doplňků).
Pokud chcete zaregistrovat poskytovatele taggeru, musíte ho exportovat společně s následujícími atributy:
ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), pro který je vaše doplňková položka platná.
TextViewRoleAttribute: druh textového zobrazení, pro které je tato značka nebo doplňková položka platná. Třída PredefinedTextViewRoles má sadu předdefinovaných rolí zobrazení textu. Například Document se primárně používá pro textová zobrazení souborů. Interactive se používá pro textová zobrazení, která uživatel může upravovat nebo procházet pomocí myši a klávesnice. Interactive Příklady zobrazení jsou textové zobrazení editoru a okno Výstup.
TagTypeAttribute: druh značky nebo doplňku, který jste definovali. Je nutné přidat sekundu TagTypeAttribute pro SpaceNegotiatingAdornmentTag.
Následující příklad ukazuje atributy exportu na zprostředkovateli taggeru pro značku doplňku pro vyjednávání prostoru.
[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(SpaceNegotiatingAdornmentTag))]
[TagType(typeof(TestSpaceNegotiatingTag))]
internal sealed class TestTaggerProvider : ITaggerProvider
Rozšíření procesorů myši
Můžete přidat speciální zpracování pro vstup myši. Vytvořte třídu, která dědí události MouseProcessorBase myši a přepíše události myši pro vstup, který chcete zpracovat. Musíte také implementovat IMouseProcessorProvider druhou třídu a exportovat ji společně s ContentTypeAttribute tím, který určuje druh obsahu (například "text" nebo "kód"), pro který je obslužná rutina myši platná.
Následující příklad ukazuje atributy exportu na zprostředkovateli procesoru myši.
[Export(typeof(IMouseProcessorProvider))]
[Name("test mouse processor")]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal sealed class TestMouseProcessorProvider : IMouseProcessorProvider
Rozšíření obslužných rutin pro vkládání
Chování obslužných rutin přetažení pro konkrétní druhy textu můžete přizpůsobit vytvořením třídy, která implementuje IDropHandler a druhou třídu, která implementuje vytvoření obslužné rutiny IDropHandlerProvider přetažení. Obslužnou rutinu drop musíte exportovat společně s následujícími atributy:
DropFormatAttribute: Textový formát, pro který je tato obslužná rutina přetažení platná. Následující formáty se zpracovávají v pořadí priority od nejvyššího po nejnižší:
Libovolný vlastní formát
Filedrop
EnhancedMetafile
Waveaudio
Riff
Dif
Národní prostředí
Palety
PenData
Serializovatelný
Symbolický odkaz
Xaml
XamlPackage
Tiff
Bitmapové
Dib
MetafilePicture
CSV
System.string
Formát HTML
Unicodetext
OEMText
Text
NameAttribute: název obslužné rutiny přetažení.
OrderAttribute: řazení obslužné rutiny přetažení před nebo za výchozí obslužnou rutinou přetažení. Výchozí obslužná rutina přetažení pro Visual Studio má název DefaultFileDropHandler.
Následující příklad ukazuje atributy exportu u zprostředkovatele obslužné rutiny přetažení.
[Export(typeof(IDropHandlerProvider))]
[DropFormat("Text")]
[Name("TestDropHandler")]
[Order(Before="DefaultFileDropHandler")]
internal class TestDropHandlerProvider : IDropHandlerProvider
Rozšíření možností editoru
Můžete definovat možnosti, které mají být platné jenom v určitém oboru, například v textovém zobrazení. Editor poskytuje tuto sadu předdefinovaných možností: možnosti editoru, možnosti zobrazení a možnosti zobrazení WPF (Windows Presentation Foundation). Tyto možnosti lze nalézt v DefaultOptions, DefaultTextViewOptionsa DefaultWpfViewOptions.
Pokud chcete přidat novou možnost, odvozte třídu z jedné z těchto tříd definic možností:
-
Následující příklad ukazuje, jak exportovat definici možnosti, která má logickou hodnotu.
[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>
Rozšíření Technologie IntelliSense
IntelliSense je obecný termín pro skupinu funkcí, které poskytují informace o strukturovaném textu a doplňování příkazů. Mezi tyto funkce patří dokončování příkazů, nápověda k podpisu, rychlé informace a žárovky. Dokončování příkazů pomáhá uživatelům správně zadat klíčové slovo jazyka nebo název člena. V nápovědě k podpisu se zobrazí podpis nebo podpisy pro metodu, kterou uživatel právě zadal. Rychlé informace zobrazí úplný podpis pro název typu nebo člena, když na něm myš leží. Žárovka poskytuje další akce pro určité identifikátory v určitých kontextech, například přejmenování všech výskytů proměnné po přejmenování jednoho výskytu.
Návrh funkce IntelliSense je ve všech případech velmi stejný:
Za celkový proces zodpovídá zprostředkovatel IntelliSense.
Relace IntelliSense představuje posloupnost událostí mezi aktivací prezentujícího a potvrzením nebo zrušením výběru. Relace se obvykle aktivuje určitým gestem uživatele.
Kontroler IntelliSense zodpovídá za rozhodnutí, kdy se má relace spustit a ukončit. Také se rozhodne, kdy se mají informace potvrdit a kdy se má relace zrušit.
Zdroj IntelliSense poskytuje obsah a rozhoduje o nejlepší shodě.
Prezentující IntelliSense zodpovídá za zobrazení obsahu.
Ve většině případů doporučujeme zadat alespoň zdroj a kontroler. Pokud chcete přizpůsobit zobrazení, můžete také poskytnout prezentujícího.
Implementace zdroje IntelliSense
Pokud chcete zdroj přizpůsobit, musíte implementovat jedno (nebo více) následujících zdrojových rozhraní:
Důležité
ISmartTagSource byl zastaral ve prospěch ISuggestedActionsSource.
Kromě toho musíte implementovat poskytovatele stejného typu:
Důležité
ISmartTagSourceProvider byl zastaral ve prospěch ISuggestedActionsSourceProvider.
Zprostředkovatele musíte exportovat společně s následujícími atributy:
NameAttribute: název zdroje.
ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), na který se zdroj vztahuje.
OrderAttribute: pořadí, ve kterém se má zdroj objevit (s ohledem na jiné zdroje).
Následující příklad ukazuje atributy exportu u zprostředkovatele zdroje dokončení.
Export(typeof(ICompletionSourceProvider))]
[Name(" Test Statement Completion Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestCompletionSourceProvider : ICompletionSourceProvider
Další informace o implementaci zdrojů IntelliSense najdete v následujících návodech:
Implementace kontroleru IntelliSense
Pokud chcete přizpůsobit kontroler, musíte implementovat IIntellisenseController rozhraní. Kromě toho musíte implementovat zprostředkovatele kontroleru společně s následujícími atributy:
NameAttribute: název kontroleru.
ContentTypeAttribute: druh obsahu (například "text" nebo "kód"), na který se řadič vztahuje.
OrderAttribute: pořadí, ve kterém se má kontroler objevit (s ohledem na ostatní kontrolery).
Následující příklad ukazuje atributy exportu u zprostředkovatele kontroleru dokončení.
Export(typeof(IIntellisenseControllerProvider))]
[Name(" Test Controller Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestIntellisenseControllerProvider : IIntellisenseControllerProvider
Další informace o používání kontrolerů IntelliSense najdete v následujících návodech: