Visual Studio Custom XAML Designer - PullRequest
       52

Visual Studio Custom XAML Designer

8 голосов
/ 28 января 2012

У меня есть приложение, в котором я использую XAML для представления своего собственного графа объектов.Он сильно отличается от объектной модели WPF / Silverlight (и не используется для разработки пользовательского интерфейса), но можно визуализировать граф объекта в значимой форме.Я хотел бы добавить расширение Visual Studio для визуализации моих конкретных объектов, но у меня возникли проблемы с поиском информации по этой теме.Кто-нибудь может указать мне правильное направление?

Моя главная цель - получить несколько простых визуальных отзывов о текущем XAML;Я еще не дошел до того, что мне нужен дизайнер для поддержки визуального редактирования.Если кому-то интересно, это инструмент для моделирования промышленного оборудования;Я использую XAML для определения компонентов машины и их соединений, но в настоящее время мне нужно выполнить полное моделирование, чтобы увидеть, как машина выглядит.

Ответы [ 3 ]

11 голосов
/ 31 января 2012

Вам необходимо создать расширение Visual Studio (vsix), которое анализирует файл и визуализирует содержимое.У вас есть два варианта: надстройка Visual Studio или пакет Visual Studio (см. Подробности о расхождениях в вопросе 1139294 ).С первым легче начать, но последний даст вам больше контроля, поэтому я рекомендую его, если вы планируете редактирование в будущем.

Начните с загрузки SDK для создания расширений Visual Studio, также известного как Visual Studio 2010 SP1 SDK .Для более старой версии без SP1 нажмите здесь .

Вам необходимо ознакомиться с созданием пакетов Visual Studio.Для учебника Microsoft см. Пошаговое руководство. Создание VSPackage .Если вы следуете учебнику, у вас должно быть все необходимое для запуска пользовательского компонента из команды меню.Так что теперь все, что вам действительно нужно, это, например, обычный компонент WPF, который может анализировать / визуализировать ваш пользовательский XAML.Вам также, вероятно, нужно связать свой пользовательский тип файла с вашим компонентом.Для этого вам необходим ProvideEditorExtensionAttribute .

Нет ничего похожего на образец, поэтому смотрите Редактор семплов IDE из библиотеки примеров .Это создает небольшой редактор файлов пользовательских типов файлов, который близок к тому, что вы просите.Замените компонент редактора файлов и связанный тип файла с вашим редактором, и вы почти закончили!

0 голосов
/ 28 августа 2018

ProvideXmlEditorChooserDesignerViewAttribute - это то, что вы ищете, хотя немного странно, как вы должны это сделать, чтобы заставить его работать таким образом. https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.modeling.shell.providexmleditorchooserdesignerviewattribute_properties.aspx

Я только что получил это в своем собственном расширении, и это очень просто (как только у вас есть волшебная формула). Работа с образцом расширяемости VS «Редактор с набором инструментов» (https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/Editor_With_Toolbox),, выполните следующие действия:

  1. Изменить пользовательское расширение файла с .tbx на .xaml. Это не так уж сложно, в первую очередь просто найдите + замените .tbx на .xaml и измените файл tbx.tbx на xaml.xaml и найдите + замену в каждом файле решения. Это помечает ваш 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, указанный в параметре filepath pszMkDocument, и убедитесь, что он один из ваших (например, он использует вашу схему или что-то в этом роде). Если это так, выведите Guid EditorFactory и верните S_OK. Если нет (например, если это файл WPF .xaml), выведите Guid.Empty и верните 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 Community, и это работает как очарование для я. Удачи всем, кто сталкивается с этой попыткой выполнить ту же самую загадочную задачу. =)

0 голосов
/ 22 января 2013

Также см. Следующее, http://code.msdn.microsoft.com/windowsdesktop/Designer-View-Over-XML-20a81f17, для хорошего примера того, что вы хотите.

...