Visual Studio: как написать расширение для редактора с помощью WPF - PullRequest
11 голосов
/ 03 января 2012

Я пытаюсь написать расширение для редактора Visual Studio. Я скачал VS SDK и создал новый проект пакета Visual Studio. Но созданный мной фиктивный элемент управления является элементом управления Windows Forms, а не элементом управления WPF. Я пытаюсь заменить его на WPF-контроль, но не очень хорошо. Возможно ли это так или иначе?

Еще один связанный с этим вопрос: можно ли писать только текстовые редакторы? Что мне действительно нужно, так это редактор, который больше похож на форму с множеством различных полей. Но это не то, для чего это сделано? На панели редактора имеется множество интерфейсов, которые подразумевают только модель текстового редактора.

В идеале мне нужен редактор, очень похожий на resx-editor, в котором редактируемый файл имеет xml-контент, а editor-ui - это не одно текстовое поле, а сгенерированный cs-файл выводится как вложенный файл. Можно ли это сделать с помощью расширений редактора?

Ответы [ 3 ]

7 голосов
/ 15 сентября 2013

Это подробно объясняется здесь: WPF в Visual Studio 2010 - Часть 4. Прямой хостинг содержимого WPF

Итак, если вы используете стандартный образец Extensibility / Custom Editor, который поставляетсяс помощью Visual Studio SDK вы можете проверить его следующим образом:

1) Измените предоставленный файл EditorFactory.cs следующим образом:

        // Create the Document (editor)
        //EditorPane NewEditor = new EditorPane(editorPackage); // comment this line
        WpfEditorPane NewEditor = new WpfEditorPane(); // add this line

2) создайте, например, WpfEditorPane.cs файл выглядит так:

[ComVisible(true)]
public class WpfEditorPane : WindowPane, IVsPersistDocData
{
    private TextBox _text;

    public WpfEditorPane()
        : base(null)
    {
        _text = new TextBox(); // Note this is the standard WPF thingy, not the Winforms one
        _text.Text = "hello world";
        Content = _text; // use any FrameworkElement-based class here.
    }

    #region IVsPersistDocData Members
    // NOTE: these need to be implemented properly! following is just a sample

    public int Close()
    {
        return VSConstants.S_OK;
    }

    public int GetGuidEditorType(out Guid pClassID)
    {
        pClassID = Guid.Empty;
        return VSConstants.S_OK;
    }

    public int IsDocDataDirty(out int pfDirty)
    {
        pfDirty = 0;
        return VSConstants.S_OK;
    }

    public int IsDocDataReloadable(out int pfReloadable)
    {
        pfReloadable = 0;
        return VSConstants.S_OK;
    }

    public int LoadDocData(string pszMkDocument)
    {
        return VSConstants.S_OK;
    }

    public int OnRegisterDocData(uint docCookie, IVsHierarchy pHierNew, uint itemidNew)
    {
        return VSConstants.S_OK;
    }

    public int ReloadDocData(uint grfFlags)
    {
        return VSConstants.S_OK;
    }

    public int RenameDocData(uint grfAttribs, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
    {
        return VSConstants.S_OK;
    }

    public int SaveDocData(VSSAVEFLAGS dwSave, out string pbstrMkDocumentNew, out int pfSaveCanceled)
    {
        pbstrMkDocumentNew = null;
        pfSaveCanceled = 0;
        return VSConstants.S_OK;
    }

    public int SetUntitledDocPath(string pszDocDataPath)
    {
        return VSConstants.S_OK;
    }

    #endregion
}

Конечно, вам придется реализовать всю логику редактора (добавить интерфейсы и т. Д.), Чтобы имитировать то, что сделано в образце Winforms, поскольку то, что я здесь предоставляю, действительноминимальный материал для демонстрационных целей.

ПРИМЕЧАНИЕ: вся эта «контентная» вещь работает только начиная с Visual Studio 2010 (поэтому вам нужно убедиться, что ваш проект ссылается на сборки Visual Studio 2010, что должно быть в том случае, есливы начинаете проект с нуля, используя Visual Studio 2010).Размещение редакторов WPF в Visual Studio 2008 возможно с использованием System.Windows.Forms.Integration.ElementHost .

2 голосов
/ 03 января 2012

Я не уверен, возможно ли вышеизложенное, но быстрый поиск все-таки обнаружил это: http://karlshifflett.wordpress.com/2010/03/21/visual-studio-2010-xaml-editor-intellisense-presenter-extension/

и это:

http://blogs.msdn.com/b/visualstudio/archive/2009/12/09/building-and-publishing-an-extension-for-visual-studio-2010.aspx

В противном случае, вы не могли бы разместить элемент управления WPF внутри элемента управления winforms, используя ElementHost? Я знаю, что это обходной путь, но он может помочь вам развить ваш любимый инструментарий, пока вы найдете более постоянное решение.

С уважением,

1 голос
/ 19 сентября 2013

Существует пример исходного кода приложения VS Extension Package на MSDN: Просмотр в конструкторе поверх XML Editor .

Описание с сайта:
This Sample demonstrates how to create an extension with a WPF-based Visual Designer for editing XML files with a specific schema (XSD) in coordination with the Visual Studio XML Editor.

По общему признанию, решение предназначено для пакета расширения VS2010, однако его можно просто преобразовать и настроить на формат VS2012 - целевую платформу следует изменить на .NET 4.5, после чего следует добавить некоторые ссылки на сборки VS2012 (v.11.0) для сборки и запуска автозагрузки.проект:

Microsoft.VisualStudio.Shell.11.0.dll
Microsoft.VisualStudio.Shell.Immutable.11.0.dll
Microsoft.VisualStudio.Shell.Interop.11.0

В случае возникновения проблем, пожалуйста, посетите раздел Q & A сайта.

...