Récemment, l'extension VS2010 a été fréquemment mentionnée sur le blog Visual Studio ( http://blogs.msdn.com/visualstudio/ ), j'ai donc voulu consulter la documentation pour l'étudier. Cependant, après une longue recherche, j'y suis parvenue. Il n'y avait pas d'introduction complète à ce sujet. J'ai donc dû rechercher le contenu fourni par le modèle sur le VS IDE et l'explication sur le blog Visual Studio. Tout en utilisant Reflector, j'ai griffonné quelques codes et préparé une pratique en direct. , j'ai trouvé que l'extension créée par ce modèle était trop simple. J'ai vu qu'AxTool ( http://www.axtools.com/products-vs2010-extensions.php ) avait une extension d'éditeur de code, qui est également un VS. Extension, j'ai donc suivi cela et je l'ai fait étape par étape.
Tout d'abord, pour créer un projet d'extension VS, vous devez installer le SDK VS2010, qui est actuellement la version Beta2. Vous pouvez le télécharger ici : http://go.microsoft.com/fwlink/?LinkID=165597 ), ici, j'utilise l'éditeur Le projet créé par le modèle Text Adornment, eh bien, je n'écrirai pas en détail comment créer votre propre projet d'extension via le modèle. Si vous n'êtes pas familier avec cela, vous pouvez vous référer à cet article de Quan To. - Construction et publication d'une extension pour Visual Studio 2010.
Une fois le projet construit, TextViewCreationListener sera automatiquement généré. L'interface IWpfTextViewCreationListener est implémentée ici et l'objet IWpfTextViewCreationListener est exporté via MEF :
[TextViewRole("DOCUMENT")] [Export(typeof(IWpfTextViewCreationListener))] [ContentType("text")] classe scellée interne PETextViewCreationListener : IWpfTextViewCreationListener { void IWpfTextViewCreationListener.TextViewCreated(IWpfTextView textView) { //... } }
De cette manière, VS appellera la méthode IWpfTextViewCreationListener.TextViewCreated au moment approprié pour notifier le changement d'état d'édition de texte.
Afin de faire flotter votre propre barre d'outils, vous devez également exporter un AdornmentLayerDefinition et personnaliser la position d'affichage et l'ordre de ce calque d'ornement via l'attribut Order :
[Nom("QuickToolbarAdornmentLayer")] [Ordre(Après = "Texte")] [Export(typeof(AdornmentLayerDefinition))] public AdornmentLayerDefinition QuickToolbarLayerDefinition { get }
L'attribut Name ici est très important, nous nous appuierons sur lui pour obtenir notre AdornmentLayer dans le futur code :
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
Pour aller plus loin, revenons à IWpfTextViewCreationListener.TextViewCreated. Par ici, vous pouvez obtenir un IWpfTextView.
C'est le but et la présentation de toutes les opérations. De plus, ses événements Closed, LayoutChanged, MouseHovered, SelectionChanged et autres doivent être suspendus afin de répondre au comportement de l'utilisateur.
Puisque nous voulons utiliser le code via la barre d'outils, nous devons importer IEditorOperationsFactoryService via MEF :
[Importer] interne IEditorOperationsFactoryService EditorOperationsFactoryService { get };
De cette façon, IEditorOperations peut être obtenu via IEditorOperationsFactoryService.GetEditorOperations(ITextView) dans IWpfTextViewCreationListener.TextViewCreated Avec lui, vous pouvez modifier le code de manière pratique et rapide.
Ensuite, nous devons implémenter l'interface de la barre d'outils. Je n'entrerai pas dans les détails à ce sujet. Créez simplement un UserControl et placez-y une ToolBar. Alors, quand et où afficher cette ToolBar ? Cela dépend de l'événement SelectionChanged de IWpfTextView. L'événement mentionné ci-dessus est utilisé ici.
code
1 private void MayBeAdornmentShowCondition() 2 { 3 if (!this._textView.Selection.IsEmpty) 4 { 5 SnapshotPoint startPos = this._textView.Selection.Start.Position; 6 SnapshotPoint endPos = this._textView.Selection.End.Position; 7 IWpfTextViewLine textViewLineContainingBufferPosition = this._textView.GetTextViewLineContainingBufferPosition(startPos); 8 TextBounds CharacterBounds = textViewLineContainingBufferPosition.GetCharacterBounds(startPos); erBounds(endPos);10 si (this._fromMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 Propriété PELeftButtonMouseProcessor = null;17 try18 {19 propriété = this._textView.Properties.GetProperty<PELeftButtonMouseProcessor>(typeof(PELeftButtonMouseProcessor));20 }21 catch22 {23 }24 this._mustHaveAdornmentDisplayed = (property != null)25 && (property.IsLeftButtonDown26 || ((DateTime.Now - property.LastLeftButtonDownTime).TotalMilliseconds < 400.0));27 }28 if (this._mustHaveAdornmentDisplayed)29 {30 TextBounds selectionBounds = !this._textView.Selection.IsReversed ?bounds2 : caractèreBounds;31 int offset = 7;32 double top = selectionBounds.Top + (!this._textView.Selection.IsReversed ? (offset + textViewLineContainingBufferPosition.Height) : (-offset - ceci ._adornmentUI.ActualHeight));33 if (top < 0.0)34 {35 top = 0.0;36 }37 double left = caractèreBounds.Left + ((bounds2.Left - caractèreBounds.Left) / 2.0);38 if ((left + this._adornmentUI.ActualWidth) > this._textView.ViewportWidth)39 {40 gauche = this._textView.ViewportWidth - this._adornmentUI.ActualWidth;41 }42 Canvas.SetTop(this._adornmentUI, top);43 Canvas.SetLeft( this._adornmentUI, gauche);44 caractères longs = 0L;45 try46 {47 caractères = this._textView.Selection.SelectedSpans[0].Span.Length;48 }49 catch50 {51 }52 this._adornmentUI.SetStatus(chars) ;53 this.RenderSelectionPopup();54 }55 }56 else57 {58 this._mustHaveAdornmentDisplayed = false;59 this._adornmentLayer.RemoveAdornmentsByTag(this._adornmentTag);60 }61 }62 63 private void RenderSelectionPopup()64 {65 if ( this._mustHaveAdornmentDisplayed)66 {67 IAdornmentLayerElement element = null;68 try69 {70 element = this._adornmentLayer.Elements.First<IAdornmentLayerElement>(71 (IAdornmentLayerElement ile) => ile.Tag.ToString() == this._adornmentTag); 72 }73 catch (InvalidOperationException)74 {75 }76 if (element == null)77 {78 this._adornmentLayer.AddAdornment(this._textView.Selection.SelectedSpans[0], this._adornmentTag, this._adornmentUI);79 } 80 this._timer.Stop();81 this._timer.Start();82 }83 }84 85 private void selection_SelectionChanged(object sender, EventArgs e)86 {87 this._fromMouseHover = false;88 this.MayBeAdornmentShowCondition(); 89}90
Ensuite, il convient de noter que lors de la gestion de l'événement Closed de IWpfTextView, vous devez penser à annuler tous les travaux de finition tels que cet événement.
semi.png(12,70 K)
2010-1-25 16:42:05
barre d'outils.png(15,64 Ko)
2010-1-25 16:42:05
Ensuite, compilez le projet et le package VSIX. Les principales fonctionnalités actuellement implémentées sont :
1. Lorsque vous sélectionnez un morceau de texte dans l'éditeur de code et déplacez la souris vers la zone de texte, QuickToolbar « flottera » à côté du texte de manière semi-transparente.
2. Lorsque la souris se déplace vers la zone QuickToolbar, la QuickToolbar devient opaque et les boutons qui s'y trouvent répondent aux actions de la souris.
3. Les opérations actuellement prises en charge sont :
Couper
Copie
Coller
Supprimer
Diminuer le retrait
Augmenter le retrait
Code de commentaire (Commentaire)
Décommenter
etc.
VSIX et les méthodes de téléchargement et d'installation du code source se trouvent sur le forum GCDN : [Extension VS2010] Barre d'outils flottante ( http://gcdn.grapecity.com/showtopic-345.html )
Être l'apostrophe qui a changé "Impossible" en "Je suis possible"
-------------------------------------------------- --
Blog de WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )