Пользовательский конструктор XAML Visual Studio
У меня есть приложение, в котором я использую XAML для представления собственного пользовательского графа объектов. Он сильно отличается от объектной модели WPF/Silverlight (и не используется для дизайна пользовательского интерфейса), но можно визуализировать граф объектов значимым образом. Я хотел бы добавить расширение конструктора в Visual Studio для визуализации моих конкретных объектов, но у меня возникли проблемы с поиском информации по этой теме. Может ли кто-нибудь указать мне правильное направление?
моя главная цель должен иметь простую визуальную обратную связь с текущим XAML; я еще не нахожусь в точке, где мне нужен дизайнер Для поддержки визуального редактирования. Если кому-то интересно, это инструмент для моделирования промышленного оборудования; я использую XAML для определения компонентов машины и их соединений, но в настоящее время мне нужно запустить полную симуляцию, чтобы увидеть, как выглядит машина.
3 ответов
необходимо создать расширение Visual Studio (vsix), которое анализирует файл и визуализирует содержимое. У вас есть два варианта, Visual Studio Надстройка или пакет Visual Studio (см. сведения о различиях в вопросе 1139294). Первый немного легче начать, но последний даст вам больше контроля, поэтому я рекомендую это если вы имеете в виду редактирование в будущем.
начните с загрузки SDK для создания расширений Visual Studio, ака Visual Studio 2010 С ПАКЕТОМ ОБНОВЛЕНИЯ 1 SDK. Для более старой версии non SP1 нажмите здесь.
необходимо ознакомиться с созданием пакетов Visual Studio. Учебник по Microsoft см. В разделе пошаговое руководство: создание VSPackage. Если вы следуете учебнику, у вас должно быть все необходимое для запуск пользовательского компонента из команды меню. Так что теперь все вы действительно нужен, например, обычный компонент WPF, который может анализировать/визуализировать ваш пользовательский XAML. Вы также наверное, нужно связать собственный типом компонента. Для этого вам нужно ProvideEditorExtensionAttribute.
нет ничего похожего на образец, так вижу образец IDE Редактор С образцы библиотека. Это создает небольшой редактор файлов пользовательских типов файлов, который близок к тому, что вы просите. Замените компонент редактора файлов и связанный тип файла с вашим редактором, и вы почти закончили!
Также см. Следующее,http://code.msdn.microsoft.com/windowsdesktop/Designer-View-Over-XML-20a81f17, для хорошего примера того, что вы хотите.
ProvideXmlEditorChooserDesignerViewattribute - это то, что вы ищете, хотя немного странно, как вы должны это сделать, чтобы заставить его работать таким образом. https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.modeling.shell.providexmleditorchooserdesignerviewattribute_properties.aspx
Я только что получил это работает в моем собственном расширении, и это очень легко (как только у вас есть волшебная формула). Работа с образцом расширяемости VS "редактор с Toolbox" (https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/Editor_With_Toolbox), выполните следующие действия:
- измените расширение пользовательского файла .tbx to .код XAML. Это не слишком сложно, в первую очередь просто найти+заменить .с ТБС .xaml и измените tbx.файл tbx в xaml.xaml и find + replace в каждом файле решения. Это знаменует ваш EditorFactory как редактор .файл XAML.
-
Открыть EditorPackage.CS и удалить атрибуты ProvideEditorExtension и ProvideEditorLogicalView. Замените их этими атрибутами (очевидно, замените строки заглушки своими фактическими строками).
[ProvideXmlEditorChooserDesignerView("UnimportantDesignerViewName", "xaml", LogicalViewID.Designer, 10000, DesignerLogicalViewEditor = typeof(EditorFactory), Namespace = "YourNamespace", MatchExtensionAndNamespace = true)] [ProvideXmlEditorChooserDesignerView("UnimportantDesignerViewName_Enforced", "xaml", LogicalViewID.Designer, 10001, DesignerLogicalViewEditor = typeof(EditorFactory))] [ProvideEditorLogicalView(typeof(EditorFactory), LogicalViewID.TextView)] [ProvideEditorLogicalView(typeof(EditorFactory), LogicalViewID.Code)] [ProvideEditorLogicalView(typeof(EditorFactory), LogicalViewID.Designer)] [ProvideEditorLogicalView(typeof(EditorFactory), LogicalViewID.Debugging)]
-
Открыть EditorFactory.cs и отредактируйте метод CreateEditorInstance. Вот, ты откроешь .xaml-файл, указанный параметром pszmkdocument filepath и убедитесь, что он является одним из ваших (например, он использует вашу схему или что-то еще). Если это так, выведите свои GUID EditorFactory и верните S_OK. Если нет (например, если это WPF .xaml-файл), выходной идентификатор Guid.Пусто и возвращает VS_E_UNSUPPORTEDFORMAT.
string extension = System.IO.Path.GetExtension(pszMkDocument); if (extension.Equals(".xaml", StringComparison.OrdinalIgnoreCase)) { using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(pszMkDocument)) { reader.MoveToContent(); if (reader.NodeType == System.Xml.XmlNodeType.Element) { if (reader.NamespaceURI.Equals("YourNamespace", StringComparison.OrdinalIgnoreCase)) { EditorPane newEditor = new EditorPane(); ppunkDocView = Marshal.GetIUnknownForObject(newEditor); ppunkDocData = Marshal.GetIUnknownForObject(newEditor); pbstrEditorCaption = ""; return VSConstants.S_OK; } } } } return VSConstants.VS_E_UNSUPPORTEDFORMAT;
я наткнулся на эту магическую формулу атрибута через репозиторий кода Avalonia GitHub(https://github.com/AvaloniaUI/AvaloniaVS/blob/master/src/AvaloniaVS/Infrastructure/AvaloniaPackage.cs)Большое спасибо тем парням, что выяснили это. Я только что реализовал это в сообществе VS 2017, и это работает как шарм для меня. Удачи любой, кто натыкается на это, пытается выполнить ту же самую тайную задачу. =)