Я создаю пользовательскую диаграмму рабочего процесса через API DGML, где каждый узел соответствует классу С#. Я хотел бы иметь возможность использовать встроенную функцию «Перейти к определению», но отсутствует документация.
DGML: как включить «Перейти к определению» для пользовательских диаграмм?
Ответы (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; }
}
DGML
? Как график связан с вашим кодом?
- person Matze; 18.02.2015
Вы не можете изменить определение перехода, но вместо этого можете использовать «ссылку перехода». Если вы вручную редактируете файл DGML в текстовом редакторе, вы можете добавить к узлу свойство «Ссылка», например:
<Node Id="Boomerang" Reference="Boomerang.dgml"/>
Затем, когда вы щелкнете правой кнопкой мыши по этому узлу в VS, вы увидите новое меню под названием «Перейти к ссылке» с подменю, содержащим «Ссылка», если вы щелкнете по нему, он откроет указанный файл DGML.
См. https://msdn.microsoft.com/en-us/library/ee842619.aspx#AddReferences для получения более подробной информации.
У 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)"/>