Recentemente, a extensão VS2010 foi mencionada com frequência no blog do Visual Studio ( http://blogs.msdn.com/visualstudio/ ), então eu queria dar uma olhada na documentação para estudá-la. não houve uma introdução completa a este tópico. Então, tive que procurar o conteúdo fornecido pelo modelo no IDE do VS e a explicação no Blog do Visual Studio. No entanto, enquanto usava o Reflector, rabisquei alguns códigos e me preparei para uma prática ao vivo. , achei que a extensão criada por este modelo era muito simples. Acontece que vi que AxTool ( http://www.axtools.com/products-vs2010-extensions.php ) tem uma extensão de editor de código, que também é um VS. Extensão, então segui isso e fiz passo a passo.
Em primeiro lugar, para criar um projeto de extensão VS, você precisa instalar o SDK VS2010, que atualmente é a versão Beta2. Você pode baixá-lo aqui: http://go.microsoft.com/fwlink/?LinkID=165597 ), aqui eu uso o Editor O projeto criado pelo template Text Adornment, bem, não vou escrever em detalhes como criar seu próprio projeto de extensão através do template. Se você não está familiarizado com isso, pode consultar este post de Quan To. - Construindo e publicando uma extensão para Visual Studio 2010.
Após a construção do projeto, TextViewCreationListener será gerado automaticamente. A interface IWpfTextViewCreationListener é implementada aqui e o objeto IWpfTextViewCreationListener é exportado por meio do MEF:
[TextViewRole("DOCUMENT")] [Export(typeof(IWpfTextViewCreationListener))] [ContentType("text")] classe selada interna PETextViewCreationListener: IWpfTextViewCreationListener { void IWpfTextViewCreationListener.TextViewCreated(IWpfTextView textView) { //... } }
Dessa forma, o VS chamará o método IWpfTextViewCreationListener.TextViewCreated no momento apropriado para notificar a mudança no status da edição de texto.
Para fazer sua própria barra de ferramentas flutuar, você também precisa exportar um AdornmentLayerDefinition e personalizar a posição de exibição e a ordem desta camada de adorno através do atributo Order:
[Name("QuickToolbarAdornmentLayer")] [Order(After = "Text")] [Export(typeof(AdornmentLayerDefinition))] public AdornmentLayerDefinition QuickToolbarLayerDefinition { get set;
O atributo Name aqui é muito importante. Contaremos com ele para obter nosso AdornmentLayer em código futuro:
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
Indo um passo adiante, vamos voltar para IWpfTextViewCreationListener.TextViewCreated. Aqui, você pode obter um IWpfTextView.
Este é o objetivo e a apresentação de todas as operações. Além disso, seus eventos Closed, LayoutChanged, MouseHovered, SelectionChanged e outros precisam ser suspensos para responder ao comportamento do usuário.
Como queremos operar o código através da barra de ferramentas, precisamos importar IEditorOperationsFactoryService através do MEF:
[Importar] interno IEditorOperationsFactoryService EditorOperationsFactoryService { get set;
Desta forma, IEditorOperations pode ser obtido através de IEditorOperationsFactoryService.GetEditorOperations(ITextView) em IWpfTextViewCreationListener.TextViewCreated. Com ele, você pode editar o código de forma conveniente e rápida.
A seguir, precisamos implementar a interface da barra de ferramentas. Não entrarei em detalhes sobre isso. Basta criar um UserControl e colocar uma ToolBar nele. Então, quando e onde exibir esta ToolBar? Isso depende do evento SelectionChanged de IWpfTextView. O evento mencionado acima é usado aqui.
código
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); Pos);10 se (this._fromMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 PELeftButtonMouseProcessor propriedade = null;17 try18 {19 propriedade = 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 seleçãoBounds = !this._textView.Selection.IsReversed ? limites2 : characterBounds;31 int offset = 7;32 double top = selectionBounds.Top + (!this._textView.Selection.IsReversed ? (offset + textViewLineContainingBufferPosition.Height): (-offset - this ._adornmentUI.ActualHeight));33 if (top < 0,0)34 {35 top = 0,0;36 }37 double left = characterBounds.Left + ((bounds2.Left - characterBounds.Left) / 2.0);38 if ((left + this._adornmentUI.ActualWidth) > this._textView.ViewportWidth)39 {40 left = this._textView.ViewportWidth - this._adornmentUI.ActualWidth;41 }42 Canvas.SetTop(this._adornmentUI, top);43 Canvas.SetLeft( this._adornmentUI, esquerda);44 caracteres longos = 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 (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(objeto remetente, EventArgs e)86 {87 this._fromMouseHover = false;88 this.MayBeAdornmentShowCondition(); 89}90
A seguir deve-se observar que ao tratar o evento Closed do IWpfTextView, deve-se lembrar de cancelar todos os trabalhos de acabamento como este evento.
semi.png (12,70 K)
25/01/2010 16:42:05
barra de ferramentas.png(15,64 K)
25/01/2010 16:42:05
A seguir, compile o projeto e empacote VSIX. Os principais recursos implementados atualmente são:
1. Quando você seleciona um trecho de texto no editor de código e move o mouse para a área de texto, o QuickToolbar “flutuará” próximo ao texto de maneira semitransparente.
2. Quando o mouse se move para a área QuickToolbar, a QuickToolbar ficará opaca e os botões responderão às ações do mouse.
3. As operações atualmente suportadas são:
Corte
Cópia
Colar
Excluir
Diminuir recuo
Aumentar recuo
Código de comentário (comentário)
Remova o comentário
etc.
Os métodos de download e instalação do VSIX e do código-fonte estão no fórum GCDN: [Extensão VS2010] Barra de ferramentas flutuante ( http://gcdn.grapecity.com/showtopic-345.html )
Ser o apóstrofo que transformou “Impossível” em “Sou possível”
-------------------------------------------------- --
Blog do WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN ( http://gcdn.grapecity.com/cs )