В Visual Studio Solution Explorer — это мощный инструмент для управления проектами и файлами в решении и навигации по ним. Он обеспечивает иерархическое представление структуры вашего проекта, упрощая поиск файлов и манипулирование ими. Однако иногда бывает сложно отслеживать текущий активный элемент в обозревателе решений. В этой статье мы рассмотрим различные методы синхронизации и отслеживания активного элемента в обозревателе решений, а также примеры кода.
Метод 1: использование DTE.Events.SelectionEvents
Объект DTE (среда средств разработки) в Visual Studio предоставляет событие под названием «SelectionEvents», которое позволяет отслеживать изменения выбора в обозревателе решений. Вот пример:
using EnvDTE;
public void TrackActiveItem()
{
DTE dte = (DTE)GetService(typeof(DTE));
dte.Events.SelectionEvents.OnChange += OnSelectionChanged;
}
private void OnSelectionChanged()
{
UIHierarchy solutionExplorer = dte.ToolWindows.SolutionExplorer;
UIHierarchyItem selectedItem = solutionExplorer.SelectedItems.Item(1);
// Track the selected item here
// ...
}
Метод 2: использование IVsTrackSelectionEx
Другой подход — использовать интерфейс IVsTrackSelectionEx, который предоставляет методы для отслеживания выбранного элемента в обозревателе решений. Вот пример:
using Microsoft.VisualStudio.Shell.Interop;
public void TrackActiveItem()
{
IVsMonitorSelection monitorSelection = (IVsMonitorSelection)GetService(typeof(SVsShellMonitorSelection));
monitorSelection.AdviseSelectionEvents(new SelectionEventsSink(), out uint cookie);
}
private class SelectionEventsSink : IVsSelectionEvents
{
public int OnSelectionChanged(IVsHierarchy pHierOld, uint itemidOld, IVsMultiItemSelect pMISOld, ISelectionContainer pSCOld,
IVsHierarchy pHierNew, uint itemidNew, IVsMultiItemSelect pMISNew, ISelectionContainer pSCNew)
{
// Track the selected item here
// ...
return VSConstants.S_OK;
}
}
Метод 3: использование GUID пакета и идентификатора элемента
Каждый элемент в обозревателе решений имеет уникальный GUID пакета и идентификатор элемента, которые можно использовать для отслеживания активного элемента. Вот пример:
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
public void TrackActiveItem()
{
IVsHierarchy hierarchy;
uint itemID;
IVsMonitorSelection monitorSelection = (IVsMonitorSelection)GetService(typeof(SVsShellMonitorSelection));
monitorSelection.GetCurrentSelection(out hierarchy, out itemID, out _, out _);
IVsUIHierarchy uiHierarchy = (IVsUIHierarchy)hierarchy;
if (uiHierarchy != null)
{
uiHierarchy.GetCanonicalName(itemID, out string itemName);
// Track the selected item here
// ...
}
}
Используя предоставленные примеры кода, вы можете легко синхронизировать и отслеживать активный элемент в обозревателе решений, используя различные подходы в Visual Studio. Поэкспериментируйте с этими методами, чтобы повысить свою продуктивность при работе над проектами. Будьте организованы и сосредоточьтесь на поставленной задаче.