Копирование кода из Visual Studio с сохранением раскраски
В последней версии Visual Studio 2019 столкнулся с такой проблемой, что при копировании кода в Word он теряет свой цвет(становится просто серым). Как это исправить? При этом не пользоваться сторонними утилитами, типа Notepad++ или какими-либо сайтами. Помогите, пожалуйста.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Не работает отладка кода в Visual Studio pro 2012+qt visual studio add-in 1.2.1
Здравствуйте, скажите пожалуйста в чем проблема, запускаю этот код (F5) в Visual Studio #include.
Импорт папки в Visual Studio с сохранением иерархии вложенных папок
Здравствуйте! Вопрос следующий, требуется импортировать в проект папку с файлами (хедерами и.
RAD Studio. Как форматирование кода максимально приблизить к Visual Studio?
Доброго времени суток! Прошу ответа на вопрос: как в Embarcadero RAD Studio XE2 (2011).
Выделение цветом синтаксиса при отображении кода в редакторе кода Visual Studio
Для улучшения читабельности кода я использую выделение цветом синтаксиса для методов в редакторе.
6578 / 4563 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
Сообщение от Lexangross51 
В последней версии Visual Studio 2019 столкнулся с такой проблемой, что при копировании кода в Word он теряет свой цвет(становится просто серым). Как это исправить? При этом не пользоваться сторонними утилитами, типа Notepad++ или какими-либо сайтами. Помогите, пожалуйста.
Галочка, наверное, снята Tools->Options->Text Editor->Advanced->Copy rich edit text.
Регистрация: 24.05.2014
Сообщений: 1,020
Вот у меня галочка стоит, а при копировании весь цвет теряется. Зато если я его перетаскиваю, то всё ОК
1349 / 850 / 363
Регистрация: 26.02.2015
Сообщений: 3,789
Может быть проблема в MS Word?
![]()
8369 / 4255 / 1614
Регистрация: 01.02.2015
Сообщений: 13,239
Записей в блоге: 5
У пакета OpenOffice и его развития LibreOffice для Writer (эквивалента Word) есть дополнение (и не одно), которое текст выделенный в Writer форматирует с цветовой подсветкой синтаксиса.
Очень вероятно, что и для MS Word есть подобные расширения.
Добавлено через 1 минуту
Это просто идея другого подхода к решению, кроме копирования в виде Rich Text.
Добавлено через 11 минут
Ещё в интернетах советуют вариант.
В онлайн редактор https://tohtml.com записать код, установить язык, скопировать и вставить в Word.
Регистрация: 24.05.2014
Сообщений: 1,020
Nishen, В гугл документы копируется так же
Регистрация: 24.05.2014
Сообщений: 1,020
Ещё вариант – увеличить максимальную длину в «Средства → Параметры → Текстовый редактор → Дополнительно → Копировать форматированный текст. → максимальнаядлина»
А то кто-то может галочку и поставил, а параметр «максимальнаядлина» не заметил
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Формат кода в visual studio
Как в visual studio 2013 настроить форматирование кода? Он подводит под свой стиль, в котором я.
Установка C++ Redistributable Visual Studio 2017 и Visual C++ для Visual Studio 2015
Доброго дня. Пытаюсь изучить PHP. Решил установить сервер локальный. В инструкции сказано: "Ещё.
Проблема с компиляцией кода в Visual Studio 10.0
Только начал пользоваться C#, немного знаком лишь с Pascal, поэтому полный чайник в.
Редактирование кода в Visual Studio 2010
Добрый день! Только начал изучать язык, работаю по книге с Windows Forms. Часто возникает проблема.
Выполнение исходного кода в Visual Studio
Возник вопрос: Не создавая проект я создал файл с разрешением ".cpp". Как выполнить исходный код.
Переделка кода Builder -> Visual Studio
Проблемка заключается в том, что я стал портировать код от С++ Builder в C++ Visual Studio 2010.
Настройка функции копирования
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
В определенном домене языке (DSL), созданном с помощью пакета SDK для визуализации и моделирования Visual Studio, можно изменить то, что происходит при копировании и вставке элементов пользователем.
Стандартное поведение копирования и вставки
Чтобы включить копирование, задайте свойство Enable Copy Paste узла Редактора в Обозреватель DSL.
По умолчанию, когда пользователь копирует элементы в буфер обмена, также копируются следующие элементы.

- Внедренные элементы-потомки выбранных элементов (т. е. элементы, которые являются целевыми объектами отношений внедрения для копируемых элементов).
- Связи отношений между скопированными элементами. Это правило применяется к скопированным элементам и связям рекурсивно. Скопированные элементы и связи сериализуются и сохраняются в ElementGroupPrototype (EGP), который размещается в буфере обмена. Изображение скопированных элементов также помещается в буфер обмена. Это позволяет пользователю вставлять их в другие приложения, например в Word. Пользователь может вставить скопированные элементы в целевой объект, который может принять их в соответствии с определением DSL. Например, в DSL, созданном из шаблона решения компонентов, пользователь может вставить порты в компоненты, но не в схему, а также вставить компоненты в схему, но не в другие компоненты.
Настройка поведения копирования и вставки
Дополнительные сведения о настройке модели с помощью кода программы см. в статье «Навигация и обновление модели в коде программы».
Включите или отключите копирование, вырезать и вставить. В Обозреватель DSL задайте свойство Enable Copy Paste узла Editor.
Скопируйте ссылки на тот же целевой объект. например, чтобы скопировать поле для комментариев, связанное с тем же элементом темы. Задайте свойству «Распространение копирования» роли только для распространения копирования. Дополнительные сведения см. в разделе «Настройка поведения копирования ссылок».
Скопируйте связанные элементы. Например, при копировании нового элемента также делаются копии всех связанных полей комментариев. Задайте свойству «Распространение копирования » роли для распространения копирования, чтобы связать и противоположного проигрывателя ролей. Дополнительные сведения см. в разделе «Настройка поведения копирования ссылок».
Быстрое дублирование элементов путем копирования и вставки. Обычно элемент, который только что был скопирован, остается выбран, и в него нельзя вставить такой же тип элемента. Добавьте директиву слияния элементов в класс домена и настройте его на передачу слияний в родительский класс. Это будет также влиять на операции перетаскивания. Дополнительные сведения см. в разделе «Настройка создания и перемещения элементов».
Выберите схему перед вставкой элементов, переопределив ClipboardCommandSet.ProcessOnPasteCommand() . Добавьте этот код в пользовательский файл в проекте DslPackage:
namespace Company.MyDsl < using System.Linq; using Microsoft.VisualStudio.Modeling.Diagrams; using Microsoft.VisualStudio.Modeling.Shell; partial class MyDslClipboardCommandSet < protected override void ProcessOnMenuPasteCommand() < // Deselect the current selection after copying: Diagram diagram = (this.CurrentModelingDocView as SingleDiagramDocView).Diagram; this.CurrentModelingDocView .SelectObjects(1, new object[] < diagram >, 0); > > >
Создайте дополнительные ссылки, когда пользователь вставляется в выбранный целевой объект. Например, когда поле для комментариев вставляется в элемент, между ними создается связь. Добавьте директиву слияния элементов в целевой класс домена и настройте его на обработку слияния добавлением связей. Это будет также влиять на операции перетаскивания. Дополнительные сведения см. в разделе «Настройка создания и перемещения элементов».
Переопределите ClipboardCommandSet.ProcessOnPasteCommand() для создания дополнительных связей после вызова базового метода.
Настройте форматы, в которых элементы можно копировать во внешние приложения, например, чтобы добавить границу в форму растрового изображения. Переопределите MyDsl ClipboardCommandSet.ProcessOnMenuCopyCommand() в проекте DslPackage.
Настройте способ копирования элементов в буфер обмена с помощью команды копирования, но не в операции перетаскивания. Переопределите MyDsl ClipboardCommandSet.CopyModelElementsIntoElementGroupPrototype() в проекте DslPackage.
Сохраните макет фигуры с помощью копирования и вставки. Если пользователь копирует несколько фигур, можно сделать так, чтобы при вставке их положение относительно друг друга сохранялось. Этот метод демонстрируется примером в VMSDK: пример схемы схемы.
Чтобы достигнуть такого эффекта, добавьте фигуры и соединители в скопированный ElementGroupPrototype. Самый удобный метод переопределения — это ElementOperations.CreateElementGroupPrototype(). Для этого добавьте в проект Dsl следующий код:
public class MyElementOperations : DesignSurfaceElementOperations < // Create an EGP to add to the clipboard. // Called when the elements to be copied have been // collected into an ElementGroup. protected override ElementGroupPrototype CreateElementGroupPrototype(ElementGroup elementGroup, ICollectionelements, ClosureType closureType) < // Add the shapes and connectors: // Get the elements already in the group: ModelElement[] mels = elementGroup.ModelElements .Concat(elementGroup.ElementLinks) // Omit if the paste target is not the diagram. .ToArray(); // Get their shapes: IEnumerableshapes = mels.SelectMany(mel => PresentationViewsSubject.GetPresentation(mel)); elementGroup.AddRange(shapes); return base.CreateElementGroupPrototype (elementGroup, elements, closureType); > public MyElementOperations(IServiceProvider serviceProvider, ElementOps1Diagram diagram) : base(serviceProvider, diagram) < >> // Replace the standard ElementOperations // singleton with your own: partial class MyDslDiagram // EDIT NAME < /// /// Singleton ElementOperations attached to this diagram. /// public override DesignSurfaceElementOperations ElementOperations < get < if (singleton == null) < singleton = new MyElementOperations(this.Store as IServiceProvider, this); >return singleton; > > private MyElementOperations singleton = null; >
Вставьте фигуры в выбранное место, например в текущее положение указателя. Если пользователь копирует несколько фигур, можно сделать так, чтобы при вставке их положение относительно друг друга сохранялось. Этот метод демонстрируется примером в VMSDK: пример схемы схемы.
Для достижения такого эффекта переопределите ClipboardCommandSet.ProcessOnMenuPasteCommand() , чтобы использовать версию ElementOperations.Merge() , зависящую от местоположения. Для этого добавьте в проект DslPackage следующий код:
partial class MyDslClipboardCommandSet // EDIT NAME < /// /// This method assumes we only want to paste things onto the diagram /// - not onto anything contained in the diagram. /// The base method pastes in a free space on the diagram. /// But if the menu was used to invoke paste, we want to paste in the cursor position. /// protected override void ProcessOnMenuPasteCommand() < NestedShapesSampleDocView docView = this.CurrentModelingDocView as NestedShapesSampleDocView; // Retrieve data from clipboard: System.Windows.Forms.IDataObject data = System.Windows.Forms.Clipboard.GetDataObject(); Diagram diagram = docView.CurrentDiagram; if (diagram == null) return; if (!docView.IsContextMenuShowing) < // User hit CTRL+V - just use base method. // Deselect anything that's selected, otherwise // pasted item will be incompatible: if (!this.IsDiagramSelected()) < docView.SelectObjects(1, new object[] < diagram >, 0); > // Paste into a convenient spare space on diagram: base.ProcessOnMenuPasteCommand(); > else < // User right-clicked - paste at mouse position. // Utility class: DesignSurfaceElementOperations op = diagram.ElementOperations; ShapeElement pasteTarget = diagram; // Check whether what's in the paste buffer is acceptable on the target. if (pasteTarget != null && op.CanMerge(pasteTarget, data)) < // Although op.Merge would be a no-op if CanMerge failed, we check CanMerge first // so that we don't create an empty transaction (after which Undo would be no-op). using (Transaction t = diagram.Store.TransactionManager.BeginTransaction("paste")) < PointD place = docView.ContextMenuMousePosition; op.Merge(pasteTarget, data, PointD.ToPointF(place)); t.Commit(); >> > > >
Пусть пользователь перетаскивает элементы. См . практическое руководство. Добавление обработчика перетаскивания.
Настройка поведения копирования ссылок
Когда пользователь копирует элемент, стандартное поведение заключается в том, что также копируются все внедренные элементы. Стандартное поведение копирования можно изменить. В определении DSL выберите роль в одной стороне связи и в окно свойств задайте значение «Распространение копирования«.

Поддерживается три значения:

- Не распространять копирование.
- Распространить копирование только на связь: когда вставляется группа, новая копия этой связи ссылается на существующий элемент на другом конце связи.
- Распространить копирование на исполнителя противоположной роли: скопированная группа включает копию элемента на другом конце связи. Сделанные изменения повлияют на элементы и скопированное изображение.
Программирование поведения копирования и вставки
Многие аспекты поведения DSL относительно копирования, вставки, создания и удаления объектов управляются экземпляром ElementOperations , который связан с схемой. Вы можете изменить поведение DSL, наследив собственный класс и ElementOperations переопределив ElementOperations свойство класса схемы.
Дополнительные сведения о настройке модели с помощью кода программы см. в статье «Навигация и обновление модели в коде программы».


Определение собственного ElementOperations
- В новом файле проекта доменного языка создайте класс, производный от класса DesignSurfaceElementOperations.
- Добавьте определение разделяемого класса для класса схемы. Имя этого класса можно найти в dsl\GeneratedCode\Diagrams.cs. В классе схемы переопределите ElementOperations , чтобы вернуть экземпляр подкласса ElementOperations. Необходимо вернуть тот же самый экземпляр в каждом классе. Добавьте этот код в пользовательский файл кода в проекте DslPackage:
using Microsoft.VisualStudio.Modeling; using Microsoft.VisualStudio.Modeling.Diagrams; using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement; public partial class MyDslDiagram < public override DesignSurfaceElementOperations ElementOperations < get < if (this.elementOperations == null) < this.elementOperations = new MyElementOperations(this.Store as IServiceProvider, this); >return this.elementOperations; > > private MyElementOperations elementOperations = null; > public class MyElementOperations : DesignSurfaceElementOperations < public MyElementOperations(IServiceProvider serviceProvider, MyDslDiagram diagram) : base(serviceProvider, diagram) < >// Overridden methods follow >
Получение элементов, перетаскиваемых из других моделей
ElementOperations можно также использовать для определения поведения копирования, перемещения, удаления и перетаскивания. Для демонстрации использования ElementOperations в приведенном ниже примере определяется пользовательское поведение перетаскивания. Однако для этого можно рассмотреть альтернативный подход, описанный в разделе «Практическое руководство. Добавление обработчика перетаскивания», который является более расширяемым.
Определите два метода в классе ElementOperations:
- CanMerge(ModelElement targetElement, System.Windows.Forms.IDataObject data) определяет, можно ли перетащить исходный элемент на целевую фигуру, соединитель или схему.
- MergeElementGroupPrototype(ModelElement targetElement, ElementGroupPrototype sourcePrototype) который объединяет исходный элемент в целевой объект.
CanMerge()
CanMerge() вызывается для определения отзывов, которые должны быть предоставлены пользователю при перемещении мыши по схеме. Для метода используются следующие параметры: элемент, на который наводится указатель мыши, и данные об источнике, из которого была выполнена операция перетаскивания. Пользователь может перетащить элемент из любого места экрана, поэтому исходный объект может быть разных типов и сериализован в разных форматах. Если источник является доменным языком или моделью UML, параметр данных является сериализацией ElementGroupPrototype. Операции перетаскивания, копирования и панели инструментов используют ElementGroupPrototypes для представления фрагментов моделей.
Прототип группы элементов может содержать любое количество элементов и связей. Типы элементов можно идентифицировать по их GUID. GUID принадлежит перетащенной фигуре, а не базовому элементу модели. В следующем примере CanMerge() возвращает значение true, если фигура класса из диаграммы UML перетаскивается в эту схему.
public override bool CanMerge(ModelElement targetShape, System.Windows.Forms.IDataObject data) < // Extract the element prototype from the data. ElementGroupPrototype prototype = ElementOperations.GetElementGroupPrototype(this.ServiceProvider, data); if (targetShape is MyTargetShape && prototype != null && prototype.RootProtoElements.Any(rootElement =>rootElement.DomainClassId.ToString() == "3866d10c-cc4e-438b-b46f-bb24380e1678")) // Guid of UML Class shapes // or SourceClass.DomainClassId return true; return base.CanMerge(targetShape, data); >
MergeElementGroupPrototype()
Этот метод вызывается, если пользователь вставляет элемент в схему, фигуру или соединитель. Он должен произвести слияние перетаскиваемого содержимого с целевым объектом. В этом примере код определяет, распознается ли комбинация типов цели и прототипа. Если да, то метод преобразует перетаскиваемые элементы в прототип элементов, которые должны быть добавлены к модели. Базовый метод вызывается для выполнения слияния преобразованных или не преобразованных элементов.
public override void MergeElementGroupPrototype(ModelElement targetShape, ElementGroupPrototype sourcePrototype) < ElementGroupPrototype prototypeToMerge = sourcePrototype; MyTargetShape pel = targetShape as MyTargetShape; if (pel != null) < prototypeToMerge = ConvertDraggedTypeToLocal(pel, sourcePrototype); >if (prototypeToMerge != null) base.MergeElementGroupPrototype(targetShape, prototypeToMerge); >
В этом примере обрабатываются элементы класса UML, перетаскиваемого из схемы класса UML. DSL не предусматривает прямое сохранение классов UML. Вместо этого создается элемент DSL для каждого перетаскиваемого класса UML. Это пригодится, если, например, доменный язык является схемой экземпляра. Пользователь может перетаскивать классы на схему, чтобы создать экземпляры этих классов.
private ElementGroupPrototype ConvertDraggedTypeToLocal (MyTargetShape snapshot, ElementGroupPrototype prototype) < // Find the UML project: EnvDTE.DTE dte = snapshot.Store.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; foreach (EnvDTE.Project project in dte.Solution.Projects) < IModelingProject modelingProject = project as IModelingProject; if (modelingProject == null) continue; // not a modeling project IModelStore store = modelingProject.Store; if (store == null) continue; // Look for the shape that was dragged: foreach (IDiagram umlDiagram in store.Diagrams()) < // Get modeling diagram that implements UML diagram: Diagram diagram = umlDiagram.GetObject(); Guid elementId = prototype.SourceRootElementIds.FirstOrDefault(); ShapeElement shape = diagram.Partition.ElementDirectory.FindElement(elementId) as ShapeElement; if (shape == null) continue; IClass classElement = shape.ModelElement as IClass; if (classElement == null) continue; // Create a prototype of elements in my DSL, based on the UML element: Instance instance = new Instance(snapshot.Store); instance.Type = classElement.Name; // Pack them into a prototype: ElementGroup group = new ElementGroup(instance); return group.CreatePrototype(); > > return null; >
Стандартное поведение копирования
Код в этом разделе включает методы, которые можно переопределить для изменения поведения копирования. Чтобы показать вам, как можно настроить код в соответствии с индивидуальными требованиями, в этом разделе представлен код, которые переопределяет методы, задействованные в копировании, но не изменяет стандартное поведение.
Когда пользователь нажимает сочетание клавиш CTRL + C или применяет команду меню «Копировать», вызывается метод ProcessOnMenuCopyCommand. Вы можете узнать, как это настроить в DslPackage\Generated Code\CommandSet.cs. Дополнительные сведения о настройке команд см. в разделе «Практическое руководство. Добавление команды в контекстное меню».
Можно переопределить ProcessOnMenuCopyCommand, добавив частичное определение класса MyDsl ClipboardCommandSet в проект DslPackage.
using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using Microsoft.VisualStudio.Modeling; using Microsoft.VisualStudio.Modeling.Diagrams; partial class MyDslClipboardCommandSet < /// /// Override ProcessOnMenuCopyCommand() to copy elements to the /// clipboard in different formats, or to perform additional tasks /// before or after copying - for example deselect the copied elements. /// protected override void ProcessOnMenuCopyCommand() < IListselectedModelElements = this.SelectedElements; if (selectedModelElements.Count == 0) return; // System container for clipboard data. // The IDataObject can contain data in several formats. IDataObject dataObject = new DataObject(); Bitmap bitmap = null; // For export to other programs. try < #region Create EGP for copying to a DSL. this.CopyModelElementsIntoElementGroupPrototype (dataObject, selectedModelElements); #endregion #region Create bitmap for copying to another application. // Find all the shapes associated with this selection: Listshapes = new List( this.ResolveExportedShapesForClipboardImages (dataObject, selectedModelElements)); bitmap = this.CreateBitmapForClipboard(shapes); if (bitmap != null) < dataObject.SetData(DataFormats.Bitmap, bitmap); >#endregion // Add the data to the clipboard: Clipboard.SetDataObject(dataObject, true, 5, 100); > finally < // Dispose bitmap after SetDataObject: if (bitmap != null) bitmap.Dispose(); >> /// /// Override this to customize the element group that is copied to the clipboard. /// protected override void CopyModelElementsIntoElementGroupPrototype(IDataObject dataObject, IList selectedModelElements) < return this.ElementOperations.Copy(dataObject, selectedModelElements); >>
Каждая схема имеет единственный экземпляр ElementOperations. Можно указать свою собственную производную. Этот файл, который можно поместить в проект доменного языка, будет вести себя так же, как и код, который он переопределяет:
using System; using System.Collections.Generic; using System.Linq; using Microsoft.VisualStudio.Modeling; using Microsoft.VisualStudio.Modeling.Diagrams; namespace Company.MyDsl < partial class MyDslDiagram < /// /// Singleton ElementOperations attached to this diagram. /// public override DesignSurfaceElementOperations ElementOperations < get < if (this.elementOperations == null) < this.elementOperations = new MyElementOperations(this.Store as IServiceProvider, this); >return this.elementOperations; > > private MyElementOperations elementOperations = null; > // Our own version of ElementOperations so that we can override: public class MyElementOperations : DesignSurfaceElementOperations < public MyElementOperations(IServiceProvider serviceProvider, ElementOps1Diagram diagram) : base(serviceProvider, diagram) < >/// /// Copy elements to the clipboard data. /// Provides a hook for adding custom data. /// public override void Copy(System.Windows.Forms.IDataObject data, ICollection elements, ClosureType closureType, System.Drawing.PointF sourcePosition) < if (CanAddElementGroupFormat(elements, closureType)) < AddElementGroupFormat(data, elements, closureType); >// Override these to store additional data: if (CanAddCustomFormat(elements, closureType)) < AddCustomFormat(data, elements, closureType, sourcePosition); >> protected override void AddElementGroupFormat(System.Windows.Forms.IDataObject data, ICollection elements, ClosureType closureType) < // Add the selected elements and those implied by the propagate copy rules: ElementGroup elementGroup = this.CreateElementGroup(elements, closureType); // Mark all the elements that are not embedded under other elements: this.MarkRootElements(elementGroup, elements, closureType); // Store in the clipboard data: ElementGroupPrototype elementGroupPrototype = this.CreateElementGroupPrototype(elementGroup, elements, closureType); data.SetData(ElementGroupPrototype.DefaultDataFormatName, elementGroupPrototype); >/// /// Override this to store additional elements in the element group: /// protected override ElementGroupPrototype CreateElementGroupPrototype(ElementGroup elementGroup, ICollection elements, ClosureType closureType) < ElementGroupPrototype prototype = new ElementGroupPrototype(this.Partition, elementGroup.RootElements, elementGroup); return prototype; >/// /// Create an element group from the given starting elements, using the /// copy propagation rules specified in the DSL Definition. /// By default, this includes all the embedded descendants of the starting elements, /// and also includes reference links where both ends are already included. /// /// model elements to copy /// /// protected override ElementGroup CreateElementGroup(ICollection startElements, ClosureType closureType) < // ElementClosureWalker finds all the connected elements, // according to the propagate copy rules specified in the DSL Definition: ElementClosureWalker walker = new ElementClosureWalker(this.Partition, closureType, // Normally ClosureType.CopyClosure startElements, true, // Do not load other models. null, // Optional list of domain roles not to traverse. true); // Include relationship links where both ends are already included. walker.Traverse(startElements); IListclosureList = walker.ClosureList; Dictionary closureContext = walker.Context; // create a group for this closure ElementGroup group = new ElementGroup(this.Partition); group.AddRange(closureList, false); // create the element group prototype for the group foreach (object key in closureContext.Keys) < group.SourceContext.ContextInfo[key] = closureContext[key]; >return group; > > >
См. также
- Настройка создания и перемещения элементов
- Практическое руководство. Добавление обработчика перетаскивания
- Пример: пример схемы каналов VMSDK
Компонент Text Template Transformation (Преобразование текстовых шаблонов) автоматически устанавливается как часть рабочей нагрузки разработки расширений Visual Studio. Его также можно установить на вкладке Отдельные компоненты Visual Studio Installer в категории Пакеты SDK, библиотеки и платформы. Установите компонент Пакет SDK для моделирования со вкладки Отдельные компоненты.
Программное форматирование текста в документах
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Вы можете использовать объект Range для форматирования текста в документе Microsoft Office Word.
Область применения. Сведения в этом разделе относятся к проектам уровня документа и проектам надстроек VSTO для Word. Дополнительные сведения см. в разделе «Функции», доступные по Приложение Office ликации и типу проекта.
Следующий пример выделяет первый абзац в документе и изменяет размер шрифта, имя шрифта и тип выравнивания. Затем он выбирает диапазон и отображает окно сообщения о приостановке перед выполнением следующего раздела кода. В следующем разделе вызывается метод отмены Document элемента узла (для настройки на уровне документа) или Document класса (для надстройки VSTO) три раза. Применяется стиль «Обычный отступ» и отображается окно сообщения о приостановке выполнения кода. Затем код вызывает метод Undo один раз и показывает окно сообщения.
Пример настройки на уровне документа
Форматирование текста с помощью настройки на уровне документа
- Следующий пример можно использовать в настройке на уровне документа. Чтобы использовать этот пример кода, запустите его из класса ThisDocument в своем проекте.
private void RangeFormat() < // Set the Range to the first paragraph. Word.Range rng = this.Paragraphs[1].Range; // Change the formatting. To change the font size for a right-to-left language, // such as Arabic or Hebrew, use the Font.SizeBi property instead of Font.Size. rng.Font.Size = 14; rng.Font.Name = "Arial"; rng.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; rng.Select(); MessageBox.Show("Formatted Range"); // Undo the three previous actions. object numTimes3 = 3; this.Undo(ref numTimes3); rng.Select(); MessageBox.Show("Undo 3 actions"); // Apply the Normal Indent style. object indentStyle = "Normal Indent"; rng.set_Style(ref indentStyle); rng.Select(); MessageBox.Show("Normal Indent style applied"); // Undo a single action. object numTimes1 = 1; this.Undo(ref numTimes1); rng.Select(); MessageBox.Show("Undo 1 action"); >
Private Sub RangeFormat() ' Set the Range to the first paragraph. Dim rng As Word.Range = Me.Paragraphs(1).Range ' Change the formatting. To change the font size for a right-to-left language, ' such as Arabic or Hebrew, use the Font.SizeBi property instead of Font.Size. rng.Font.Size = 14 rng.Font.Name = "Arial" rng.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter rng.Select() MessageBox.Show("Formatted Range") ' Undo the three previous actions. Me.Undo(Times:=3) rng.Select() MessageBox.Show("Undo 3 actions") ' Apply the Normal Indent style. rng.Style = "Normal Indent" rng.Select() MessageBox.Show("Normal Indent style applied") ' Undo a single action. Me.Undo() rng.Select() MessageBox.Show("Undo 1 action") End Sub
Примеры надстройки VSTO
Форматирование текста с использованием надстройки VSTO
- Следующий пример можно использовать в надстройке VSTO. В этом примере используется активный документ. Чтобы использовать этот пример кода, запустите его из класса ThisAddIn в своем проекте.
private void RangeFormat() < // Set the Range to the first paragraph. Word.Document document = this.Application.ActiveDocument; Word.Range rng = document.Paragraphs[1].Range; // Change the formatting. To change the font size for a right-to-left language, // such as Arabic or Hebrew, use the Font.SizeBi property instead of Font.Size. rng.Font.Size = 14; rng.Font.Name = "Arial"; rng.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; rng.Select(); MessageBox.Show("Formatted Range"); // Undo the three previous actions. object numTimes3 = 3; document.Undo(ref numTimes3); rng.Select(); MessageBox.Show("Undo 3 actions"); // Apply the Normal Indent style. object indentStyle = "Normal Indent"; rng.set_Style(ref indentStyle); rng.Select(); MessageBox.Show("Normal Indent style applied"); // Undo a single action. object numTimes1 = 1; document.Undo(ref numTimes1); rng.Select(); MessageBox.Show("Undo 1 action"); >
Private Sub RangeFormat() ' Set the Range to the first paragraph. Dim document As Word.Document = Me.Application.ActiveDocument Dim rng As Word.Range = document.Paragraphs(1).Range ' Change the formatting. To change the font size for a right-to-left language, ' such as Arabic or Hebrew, use the Font.SizeBi property instead of Font.Size. rng.Font.Size = 14 rng.Font.Name = "Arial" rng.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter rng.Select() MessageBox.Show("Formatted Range") ' Undo the three previous actions. document.Undo(Times:=3) rng.Select() MessageBox.Show("Undo 3 actions") ' Apply the Normal Indent style. rng.Style = "Normal Indent" rng.Select() MessageBox.Show("Normal Indent style applied") ' Undo a single action. document.Undo() rng.Select() MessageBox.Show("Undo 1 action") End Sub
См. также
- Практическое руководство. Программное определение и выбор диапазонов в документах
- Практическое руководство. Программное вставка текста в документы Word
- Практическое руководство. Программное поиск и замена текста в документах
Как вставить исходный код в документ Word

Учитывая то, как Microsoft Word структурирует документы, вставка и работа с исходным кодом труднее, чем работа в специальном редакторе кода. Однако встраивание документа создает контейнер, который защищает исходный код от переформатирования.
Инструкции в этой статье относятся к Word для Office 365, Word 2019, Word 2016, Word 2013, Word 2010 и Word 2007.
Проблема с использованием исходного кода в Word
Программисты пишут программы, используя такие языки, как Java , C ++ и HTML . Языки программирования используют различное форматирование и символы из обычных языков, поэтому вставка фрагмента кода в Word из приложения программирования приводит к ошибкам, таким как переформатирование текста, сдвиг отступов, создание ссылок и орфографические ошибки.
Одним из способов избежать этих проблем форматирования является вставка исходного кода в отдельный документ, который отображается в основном документе Word.
