В последнее время расширение VS2010 часто упоминается в блоге Visual Studio ( http://blogs.msdn.com/visualstudio/ ), поэтому я хотел заглянуть в документацию, чтобы изучить его. Однако после долгого поиска там. не было полного введения в эту тему. Поэтому мне пришлось искать содержимое шаблона в VS IDE и объяснения в блоге Visual Studio. Однако, используя Reflector, я набросал несколько кодов и приготовился к практической работе. Я почувствовал, что расширение, созданное с помощью этого шаблона, слишком простое. Я случайно увидел, что AxTool ( http://www.axtools.com/products-vs2010-extensions.php ) имеет расширение редактора кода, которое также является VS. Расширение, поэтому я последовал этому и сделал это шаг за шагом.
Прежде всего, чтобы создать проект расширения VS, вам необходимо установить VS2010 SDK, который на данный момент является версией Beta2. Его можно скачать здесь: http://go.microsoft.com/fwlink/?LinkID=165597 ). здесь я использую Редактор Проект, созданный по шаблону Text Adornment, ну и не буду подробно писать, как создать свой проект Extension через шаблон. Если вы с этим не знакомы, то можете обратиться к этому посту Quan To. - Создание и публикация расширения для Visual Studio 2010.
После сборки проекта TextViewCreationListener будет автоматически сгенерирован. Здесь реализован интерфейс IWpfTextViewCreationListener, а объект IWpfTextViewCreationListener экспортируется через MEF:
[TextViewRole("DOCUMENT")] [Export(typeof(IWpfTextViewCreationListener))] [ContentType("text")] внутренний запечатанный класс PETextViewCreationListener : IWpfTextViewCreationListener { void IWpfTextViewCreationListener.TextViewCreated(IWpfTextView textView) { //... } }
Таким образом, VS вызовет метод IWpfTextViewCreationListener.TextViewCreated в подходящее время, чтобы уведомить об изменении статуса редактирования текста.
Чтобы разместить собственную панель инструментов, вам также необходимо экспортировать AdornmentLayerDefinition и настроить положение и порядок отображения этого слоя украшения с помощью атрибута Order:
[Name("QuickToolbarAdornmentLayer")] [Order(After = "Text")] [Export(typeof(AdornmentLayerDefinition))] public AdornmentLayerDefinition QuickToolbarLayerDefinition {get;
Атрибут Name здесь очень важен. Мы будем полагаться на него для получения нашего AdornmentLayer в будущем коде:
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
Сделав еще один шаг, вернемся к IWpfTextViewCreationListener.TextViewCreated. Здесь вы можете получить IWpfTextView.
Это цель и представление всех операций. Кроме того, нужно повесить его Closed, LayoutChanged, MouseHovered, SelectionChanged и другие события, чтобы реагировать на поведение пользователя.
Поскольку мы хотим управлять кодом через панель инструментов, нам необходимо импортировать IEditorOperationsFactoryService через MEF:
[Импорт] внутренний IEditorOperationsFactoryService EditorOperationsFactoryService {get;
Таким образом, IEditorOperations можно получить через IEditorOperationsFactoryService.GetEditorOperations(ITextView) в IWpfTextViewCreationListener.TextViewCreated. С его помощью можно удобно и быстро редактировать код.
Далее нам нужно реализовать интерфейс панели инструментов. Я не буду вдаваться в подробности. Просто создайте UserControl и поместите в него ToolBar. Итак, когда и где отображать эту панель инструментов? Это зависит от события SelectionChanged IWpfTextView. Здесь используется событие, упомянутое выше.
код
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 TextBoundscharacterBounds = textViewLineContainingBufferPosition.GetCharacterBounds(startPos); 9 TextBoundsbounds2 = this._textView.GetTextViewLineContainingBufferPosition(endPos); CharacterBounds(endPos);10 if (this._fromMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 PELeftButtonMouseProcessor property = null;17 try18 {19 property = this._textView.Properties.GetProperty<PELeftButtonMouseProcessor>(typeof(PELeftButtonMouseProcessor));20 }21 catch22 {23 }24 this._mustHaveAdornmentDisplayed = (property != null)25 && (property.IsLeftButtonDown26 || ((DateTime.Now - property.LastLeftButtonDownTime).TotalMilliсекунды < 400.0));27 }28 if (this._mustHaveAdornmentDisplayed)29 {30 TextBounds choiceBounds = ? ._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, left);44 long chars = 0L;45 try46 {47 chars = 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 choice_SelectionChanged(object sender, EventArgs e)86 {87 this._fromMouseHover = false;88 this.MayBeAdornmentShowCondition(); 89}90
Затем следует отметить, что при обработке события Closed IWpfTextView необходимо не забыть отменить все завершающие работы, такие как это событие.
полу.png(12,70 К)
2010-1-25 16:42:05
тулбар.png(15,64 К)
2010-1-25 16:42:05
Затем скомпилируйте проект и упакуйте VSIX. Основные реализованные на данный момент функции:
1. Когда вы выделите фрагмент текста в редакторе кода и наведете указатель мыши на текстовую область, панель инструментов QuickToolbar будет «плавать» рядом с текстом в полупрозрачном виде.
2. Когда мышь перемещается в область панели QuickToolbar, панель QuickToolbar становится непрозрачной, а кнопки на ней будут реагировать на действия мыши.
3. В настоящее время поддерживаются следующие операции:
Резать
Копировать
Вставить
Удалить
Уменьшить отступ
Увеличить отступ
Код комментария (Комментарий)
Раскомментировать
и т. д.
Методы загрузки и установки VSIX и исходного кода можно найти на форуме GCDN: [Расширение VS2010] Плавающая панель инструментов ( http://gcdn.grapecity.com/showtopic-345.html ).
Быть апострофом, который превратил «Невозможно» в «Я возможен».
-------------------------------------------------- --
Блог Winkingzhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )