Расширение Visual Studio: Как мне найти, какое окно инструментов находится на переднем плане в группе ссылок вкладок?

В Visual Studio вы можете группировать окна инструментов вместе и идентифицировать их по вкладкам. Например, у вас могут быть окна инструментов "Вывод", "Список ошибок" и "Найти результаты 1", сгруппированные вместе на панели под вашим документом. Когда вы нажимаете на вкладку "Вывод", она выходит на передний план и захватывает фокус. Если вы вернетесь в окно документа, вкладка "Вывод" все еще будет наверху (на переднем плане).

Как программно (в расширении VS) определить (1), какие окна находятся в одной группе вкладок, и (2), какое окно находится на переднем плане, если дано одно из окон в группе?

Вот пример кода, перечисляющий все окна:

    var dte = (EnvDTE.DTE)GetService(typeof(EnvDTE.DTE));
    var windowOutput = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);
    foreach (EnvDTE.Window w in windowOutput.LinkedWindowFrame.Collection)
    {
        //gives every window, not just those grouped together
    }

1 ответ

Вы можете узнать, когда вкладка переключается на начальную итерацию через все окна EnvDTE (Window/Window2), получив соответствующий IVsWindowFrames, и подписка на уведомления о кадрах (IVsWindowFrameNotify), чтобы вы получали уведомление при изменении вкладки. Но это все равно не поможет с группами вкладок ("связанных фреймов"), не говоря уже о головной боли, связанной с обновлением ваших слушателей оконных фреймов (когда вкладки открываются / закрываются и т. Д.).

Единственная надежная вещь, о которой я могу думать, это экспортировать настройки в XML (VS делает это для сохранения макета от прогона к прогону), манипулировать XML, а затем импортировать его. Хотя я не уверен, насколько быстро это будет, но стоит попробовать. Вы можете искать Environment_WindowLayout в вашем файле.vssettings, чтобы увидеть пример XML. На самом деле сделать экспорт / импорт этой информации сложно - вы можете попытать счастья с EnvDTE.Properties collection, и, возможно, IVsUIShellDocumentWindowMgr ( пример) пригодится, но, возможно, нет.

Другие вопросы по тегам