2016-01-08 2 views
3

Я пытаюсь создать свое первое расширение для визуальной студии, и до сих пор я следил за этим руководством, чтобы начать работу (http://www.diaryofaninja.com/blog/2014/02/18/who-said-building-visual-studio-extensions-was-hard). Теперь у меня есть пользовательский элемент меню, появляющийся при щелчке по файлу в проводнике решений. Что мне нужно сейчас для моего небольшого проекта - это получить путь к файлу, выбранному в проводнике решений, но я не понимаю, как это сделать. Любая помощь?Visual Studio Extension: Получить путь к текущему выбранному файлу в обозревателе решений

---------------------------- EDIT ----------------- -------------

Как сказал мац, ответ на ссылку, которую я разместил. Я просто не замечал этого, когда писал. В то же время я нашел еще один возможный ответ в этой теме: How to get the details of the selected item in solution explorer using vs package

, где я нашел этот код:

foreach (UIHierarchyItem selItem in selectedItems) 
      { 
       ProjectItem prjItem = selItem.Object as ProjectItem; 
       string filePath = prjItem.Properties.Item("FullPath").Value.ToString(); 
       //System.Windows.Forms.MessageBox.Show(selItem.Name + filePath); 
       return filePath; 
      } 

Итак, вот два пути, чтобы получить путь к выбранному файлу (ам):)

ответ

2

В упомянутой статье уже есть решение для этого.

Ищите метод menuCommand_BeforeQueryStatus в примере кода. Он использует метод IsSingleProjectItemSelection для получения объекта IVsHierarchy, представляющего проект, а также идентификатора выбранного элемента. Кажется, что вы можете спокойно бросить иерархию IVsProject и использовать подмигнули GetMkDocument функцию для запроса item's FULLPATH ...

IVsHierarchy hierarchy = null; 
uint itemid = VSConstants.VSITEMID_NIL; 

if (IsSingleProjectItemSelection(out hierarchy, out itemid)) 
{ 
    IVsProject project; 
    if ((project = hierarchy as IVsProject) != null) 
    { 
     string itemFullPath = null; 
     project.GetMkDocument(itemid, out itemFullPath); 
    } 
} 

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

+0

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