Как получить выбранный объект в обозревателе решений в расширении VS 2015?


Мне интересно получить проект или ProjectItem (в качестве примеров, не ограничиваясь этими двумя) для текущего выбора, где выбран только один элемент.

Большинство людей, кажется, используют IVsMonitorSelection, чтобы получить IVSHierarchy, а затем используют следующее, Чтобы получить объект для выбранного элемента (в случае выбора одного элемента):

var monitorSelection = (IVsMonitorSelection) Package.GetGlobalService(typeof(IVsMonitorSelection));

IntPtr hierarchyPointer, selectionContainerPointer;
uint projectItemId;
IVsMultiItemSelect multiItemSelect;

monitorSelection.GetCurrentSelection(out hierarchyPointer, out projectItemId, out multiItemSelect, out selectionContainerPointer);

var hierarchy = (IVsHierarchy) Marshal.GetObjectForIUnknown(hierarchyPointer);

Marshal.Release(hierarchyPointer);
Marshal.Release(selectionContainerPointer);

object o;

hierarchy.GetProperty((uint) projectItemId, (int) __VSHPROPID.VSHPROPID_ExtObject, out o);

Однако, GetProperty возвращает E_NOTIMPL здесь. Я использую неправильные параметры? Может быть, есть альтернативное решение?

2 3

2 ответа:

Вы можете использовать dte.Инструментальные окна.SolutionExplorer.SelectedItems Вот так:

EnvDTE.ProjectItem projectItem = GetSelectedSolutionExplorerItem().Object as EnvDTE.ProjectItem;

    private EnvDTE.UIHierarchyItem GetSelectedSolutionExplorerItem()
    {
        EnvDTE.UIHierarchy solutionExplorer = dte.ToolWindows.SolutionExplorer;
        object[] items = solutionExplorer.SelectedItems as object[];
        if (items.Length != 1)
            return null;

        return items[0] as EnvDTE.UIHierarchyItem;
    }

Основываясь на ответе Сергея, я нашел dte.SelectedItems, который даже "более строго типизирован" и не требует приведения к массиву, содержащему UIHierarchy предметы.

Результат теперь таков:

dte.SelectedItems.Item(1).ProjectItem