DGML: как включить «Перейти к определению» для пользовательских диаграмм?

Я создаю пользовательскую диаграмму рабочего процесса через API DGML, где каждый узел соответствует классу С#. Я хотел бы иметь возможность использовать встроенную функцию «Перейти к определению», но отсутствует документация.


person Den    schedule 13.02.2015    source источник


Ответы (3)


Если вы знаете имя файла класса и положение определения символа, вы можете использовать класс VsShellUtilities, чтобы открыть документ и прокрутить артефакт кода в представление (установив положение курсора). В одном из моих расширений я делаю что-то вроде этого...

Если у меня есть тип SourceInfo, который я использую для хранения имени файла и текстового диапазона...

void GotoDefinition(
    IServiceProvider serviceProvider, 
    SourceInfo source)
{
    IVsUIHierarchy hierarchy;
    uint itemId;
    IVsWindowFrame windowFrame;
    IVsTextView view;

    VsShellUtilities.OpenDocument(
        serviceProvider,
        source.Filename,
        Guid.Empty,
        out hierarchy,
        out itemId,
        out windowFrame,
        out view);

    if (view != null)
    {
        int line, column;
        int pos = source.TextRange.Start;
        if (view.GetLineAndColumn(pos, out line, out column) == VSConstants.S_OK)
        {
            view.SetCaretPos(line, column);
            view.CenterLines(line, 1);
        }
    }
}

class SourceInfo
{
    public string Filename { get; set; }

    public TextRange TextRange { get; set; }
}
person Matze    schedule 13.02.2015
comment
Это интересно, спасибо, но мне было интересно, нужно ли просто установить правильную категорию узла и метку, чтобы он работал без дополнительного кода. - person Den; 13.02.2015
comment
Как создать график DGML? Как график связан с вашим кодом? - person Matze; 18.02.2015
comment
Я генерирую его вручную. Это не так, но мне было интересно, могу ли я просто следовать соглашениям Code Maps и автоматически получать ту же функциональность. К сожалению, нет больше времени на расследование, было интересно, если кто-то уже сделал это. - person Den; 18.02.2015

Вы не можете изменить определение перехода, но вместо этого можете использовать «ссылку перехода». Если вы вручную редактируете файл DGML в текстовом редакторе, вы можете добавить к узлу свойство «Ссылка», например:

<Node Id="Boomerang" Reference="Boomerang.dgml"/>

Затем, когда вы щелкнете правой кнопкой мыши по этому узлу в VS, вы увидите новое меню под названием «Перейти к ссылке» с подменю, содержащим «Ссылка», если вы щелкнете по нему, он откроет указанный файл DGML.

См. https://msdn.microsoft.com/en-us/library/ee842619.aspx#AddReferences для получения более подробной информации.

person Chris    schedule 02.05.2016
comment
Я почти уверен, что можно изменить определение goto. Это просто плохо задокументировано. Однако спасибо за обходной путь. - person Den; 03.05.2016

У Visual Studio есть собственное свойство SourceLocation.

Вы должны объявить это в свойствах

<Properties>
...
<Property Id="SourceLocation" Label="Start Line Number" DataType="Microsoft.VisualStudio.GraphModel.CodeSchema.SourceLocation" />
...
</Properties>

затем используйте его внутри элемента Node f.e.

<Node Id="class1" Label="FirstClass" SourceLocation="(Assembly=file:///D:/Prj/TestApp/AppConsole/Program.cs StartLineNumber=8 StartCharacterOffset=1 EndLineNumber=8 EndCharacterOffset=1)"/>
person Igor    schedule 16.05.2017