Recientemente, la extensión VS2010 se ha mencionado con frecuencia en el blog de Visual Studio ( http://blogs.msdn.com/visualstudio/ ), así que quería consultar la documentación para estudiarla. Sin embargo, después de buscar durante mucho tiempo, la encontré. No hubo una introducción completa a este tema, así que tuve que buscar el contenido proporcionado por la plantilla en VS IDE y la explicación en el Blog de Visual Studio. Sin embargo, mientras usaba Reflector, garabateé algunos códigos y me preparé para una práctica en vivo. , Sentí que la extensión creada por esta plantilla era demasiado simple. Vi que AxTool ( http://www.axtools.com/products-vs2010-extensions.php ) tiene una extensión de editor de código, que también es un VS. Extensión, así que seguí esto y lo hice paso a paso.
En primer lugar, para crear un proyecto de extensión VS, debe instalar el SDK VS2010, que actualmente es la versión Beta2. Puede descargarlo aquí: http://go.microsoft.com/fwlink/?LinkID=165597 ). aquí uso el Editor El proyecto creado por la plantilla Text Adornment, bueno, no escribiré en detalle cómo crear su propio proyecto de extensión a través de la plantilla. Si no está familiarizado con esto, puede consultar esta publicación de Quan To. - Construcción y publicación de una extensión para Visual Studio 2010.
Una vez creado el proyecto, TextViewCreationListener se generará automáticamente. Aquí se implementa la interfaz IWpfTextViewCreationListener y el objeto IWpfTextViewCreationListener se exporta a través de MEF:
[TextViewRole("DOCUMENT")] [Exportar(typeof(IWpfTextViewCreationListener))] [ContentType("text")] clase interna sellada PETextViewCreationListener: IWpfTextViewCreationListener { void IWpfTextViewCreationListener.TextViewCreated(IWpfTextView textView) { //... } }
De esta manera, VS llamará al método IWpfTextViewCreationListener.TextViewCreated en el momento adecuado para notificar el cambio de estado de edición de texto.
Para hacer flotar su propia barra de herramientas, también necesita exportar una AdornmentLayerDefinition y personalizar la posición de visualización y el orden de esta capa de Adorno a través del Atributo de Orden:
[Nombre("QuickToolbarAdornmentLayer")] [Orden(Después = "Texto")] [Exportar(tipode(AdornmentLayerDefinition))] public AdornmentLayerDefinition QuickToolbarLayerDefinition { set;
El atributo de nombre aquí es muy importante. Nos basaremos en él para obtener nuestro AdornmentLayer en el código futuro:
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
Yendo un paso más allá, volvamos a IWpfTextViewCreationListener.TextViewCreated A través de aquí, puede obtener un IWpfTextView.
Este es el objetivo y la presentación de todas las operaciones. Además, sus eventos Closed, LayoutChanged, MouseHovered, SelectionChanged y otros deben colgarse para responder al comportamiento del usuario.
Como queremos operar el código a través de la barra de herramientas, necesitamos importar IEditorOperationsFactoryService a través de MEF:
[Importar] IEditorOperationsFactoryService interno EditorOperationsFactoryService { set;
De esta manera, IEditorOperations se puede obtener a través de IEditorOperationsFactoryService.GetEditorOperations (ITextView) en IWpfTextViewCreationListener.TextViewCreated. Con él, puede editar el código de manera conveniente y rápida.
A continuación, necesitamos implementar la interfaz de la barra de herramientas. No entraré en detalles sobre esto. Simplemente cree un UserControl y coloque una barra de herramientas en él. Entonces, ¿cuándo y dónde mostrar esta barra de herramientas? Esto depende del evento SelectionChanged de IWpfTextView. Aquí se utiliza el evento mencionado anteriormente.
código
1 vacío privado 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); 0 si (this._fromMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 PELeftButtonMouseProcessor propiedad = null;17 try18 {19 propiedad = this._textView.Properties.GetProperty<PELeftButtonMouseProcessor>(typeof(PELeftButtonMouseProcessor));20 }21 catch22 {23 }24 this._mustHaveAdornmentDisplayed = (property != null)25 && (property.IsLeftButtonDown26 || ((DateTime.Now - property.LastLeftButtonDownTime).TotalMillisegundos < 400.0));27 }28 if (this._mustHaveAdornmentDisplayed)29 {30 TextBounds SelectionBounds = !this._textView.Selection.IsReversed? límites2: carácterBounds;31 int desplazamiento = 7;32 doble superior = selecciónBounds.Top + (!this._textView.Selection.IsReversed? (desplazamiento + textViewLineContainingBufferPosition.Height): (-desplazamiento - esto ._adornmentUI.ActualHeight));33 if (arriba < 0.0)34 {35 arriba = 0.0;36 }37 doble izquierda = carácterBounds.Left + ((bounds2.Left - carácterBounds.Left) / 2.0);38 if ((izquierda + this._adornmentUI.ActualWidth) > this._textView.ViewportWidth)39 {40 izquierda = this._textView.ViewportWidth - this._adornmentUI.ActualWidth;41 }42 Canvas.SetTop(this._adornmentUI, arriba);43 Canvas.SetLeft( this._adornmentUI, izquierda);44 caracteres largos = 0L;45 try46 {47 caracteres = 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 elemento IAdornmentLayerElement = null;68 try69 {70 elemento = this._adornmentLayer.Elements.First<IAdornmentLayerElement>(71 (archivo IAdornmentLayerElement) => 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 selección nula privada_SelectionChanged(remitente de objeto, EventArgs e)86 {87 this._fromMouseHover = false;88 this.MayBeAdornmentShowCondition(); 89}90
Entonces cabe señalar que al manejar el evento Cerrado de IWpfTextView, debe recordar cancelar todo el trabajo final, como este evento.
semi.png(12,70 K)
2010-1-25 16:42:05
barra de herramientas.png(15,64 K)
2010-1-25 16:42:05
A continuación, compile el proyecto y empaquete VSIX. Las principales características implementadas actualmente son:
1. Cuando selecciona un fragmento de texto en el editor de código y mueve el mouse al área de texto, QuickToolbar "flotará" junto al texto de manera semitransparente.
2. Cuando el mouse se mueve al área de QuickToolbar, QuickToolbar se volverá opaca y los botones que contiene responderán a las acciones del mouse.
3. Las operaciones admitidas actualmente son:
Cortar
Copiar
Pasta
Borrar
Disminuir sangría
Aumentar sangría
Código de comentario (Comentario)
Descomentar
etc.
VSIX y los métodos de descarga e instalación del código fuente se encuentran en el foro de GCDN: [Extensión VS2010] Barra de herramientas flotante ( http://gcdn.grapecity.com/showtopic-345.html )
Ser el apóstrofo que cambió “Imposible” por “Soy posible”
-------------------------------------------------- --
Blog de WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN ( http://gcdn.grapecity.com/cs )