Пользовательский конструктор 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), выполните следующие действия:

  1. измените расширение пользовательского файла .tbx to .код XAML. Это не слишком сложно, в первую очередь просто найти+заменить .с ТБС .xaml и измените tbx.файл tbx в xaml.xaml и find + replace в каждом файле решения. Это знаменует ваш EditorFactory как редактор .файл XAML.
  2. Открыть 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)]
    
  3. Открыть 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, и это работает как шарм для меня. Удачи любой, кто натыкается на это, пытается выполнить ту же самую тайную задачу. =)