Почему Visual Studio 2008 забывает, где закрепить панель окна моей надстройки? - PullRequest
8 голосов
/ 19 ноября 2008

Я написал простую надстройку для Visual Studio 2008, которая открывает панель окна, которую можно закрепить.

Вы можете скачать исходный код и бинарный установщик, нажав здесь.

Природа надстройки означает, что в идеале она будет закреплена рядом с тем местом, где вы редактируете свой источник. Но иногда, на некоторых установках, он не остается пристыкованным. Вы запускаете VS, закрепляете мою панель, выключаете VS, перезапускаете VS, и черт побери - панель снова всплывает. На некоторых машинах мне приходится каждый раз переустанавливать его.

Но на других установках он остается пристыкованным, куда бы я ни положил его навсегда. Первоначально я думал, что это может быть разницей между Vista и XP, но теперь у меня есть сообщения о том, что он также отклеился от XP.

Из того, что я прочитал (и из-за того факта, что он иногда остается в доке), у меня сложилось впечатление, что VS должен позаботиться о сохранении состояния стыковки для меня. Но это не так. И все же другие плагины на той же установке VS не имеют этой проблемы. Поэтому я должен что-то сделать, чтобы улучшить ситуацию.

Я подозреваю, что единственная соответствующая часть моего кода - это:

public class Connect : IDTExtensibility2
{
    private static DTE2 _applicationObject;
    private AddIn _addInInstance;
    private static CodeModelEvents _codeModelEvents;

    public static DTE2 VisualStudioApplication
    {
        get { return _applicationObject; }
    }

    public static CodeModelEvents CodeModelEvents
    {
        get { return _codeModelEvents; }
    }

    public static event EventHandler SourceChanged = delegate { };

    public void OnConnection(object application, 
           ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {
        _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
    }

    public void OnStartupComplete(ref Array custom)
    {
        try
        {
            Events2 events = (Events2)_applicationObject.Events;
            _codeModelEvents = events.get_CodeModelEvents(null);

            object objTemp = null;

            Windows2 toolWins = (Windows2)_applicationObject.Windows;

            Window toolWin = toolWins.CreateToolWindow2(
                _addInInstance, GetType().Assembly.Location, "Ora.OraPane", "Ora", 
                "{DC8A399C-D9B3-40f9-90E2-EAA16F0FBF94}", ref objTemp);
            toolWin.Visible = true;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Exception: " + ex.Message);
        }
    }

    public void OnBeginShutdown(ref Array custom) { }

    public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { }

    public void OnAddInsUpdate(ref Array custom) { }
}

(Документы MSDN предполагают, что окно должно быть создано в OnConnection, но если я сделаю это, то окно в основном не появится.)

Ответы [ 4 ]

10 голосов
/ 24 ноября 2008

Я столкнулся с некоторыми из тех же проблем с стыковкой с TeamReview (http://www.codeplex.com/TeamReview). Я не могу сказать, почему это происходит, но я могу помочь вам указать код, который всегда документирует ваше окно в OnStartupComplete. Если у вас есть определенный местоположение, в котором вы хотите, чтобы оно было, вы можете связать его, чтобы оно было внутри фрейма после создания вашего toolWin и перед вызовом свойства Visible. Вам нужно будет проверить, какие константы соответствуют вашему условию для методов CreateLinkedWindowFrame и SetKind. может захотеть связать ваше окно с чем-то отличным от MainWindow, например SolutionExplorer

EnvDTE80.Window2 frame = toolWins.CreateLinkedWindowFrame(toolWin, toolWin, vsLinkedWindowType.vsLinkedWindowTypeTabbed);


frame.SetKind(EnvDTE.vsWindowType.vsWindowTypeToolWindow);


_applicationObject.MainWindow.LinkedWindows.Add(frame);

frame.Activate();

Этот пример похож на: http://www.codeplex.com/TeamReview/SourceControl/changeset/view/16102# 2008 -> TeamReview -> Command -> ShowReplayWindowCommand.cs -> ShowForm ()

Вот хороший пример Microsoft , чтобы связать вместе окно вывода, окно команд и обозреватель решений. Затем он манипулирует шириной и высотой этих связанных окон и, наконец, отсоединяет их от рамки связанного окна.

1 голос
/ 18 февраля 2009

Вот что мне помогло. Я использую Visual Studio 2005, но это тоже может вам помочь.

public void OnBeginShutdown(ref Array custom)
{
     if (_toolWin != null)
          _toolWin.Visible = false;
}
1 голос
/ 10 февраля 2009

У меня та же проблема, что и у автора. Я заметил, что Visual Studio 2005 «забывает» положение окна инструмента только после сеансов, в которых использовалась отладка.

Принятый ответ мало помогает, потому что окно инструментов всегда пристыковано к нижней части. Я действительно хочу, чтобы пользователи могли выбирать, где они хотят закрепиться, и сохранять свои предпочтения, просто закрепляя их там, где им нравится.

0 голосов
/ 19 августа 2012

Установка видимости окна инструментов в false работает очень хорошо. спасибо JK.

Чтобы ответить на вопрос Дж.К. о расстыковке после отладки, мне интересно, вызывает ли это переключатель devenv.exe / resetaddin в свойствах отладки проектов. Это, безусловно, сбрасывает все остальное, что создает аддин.

Идея: ключ / resetaddin автоматически добавляется в конфигурацию отладки при создании проекта надстройки. Обычно я помещаю недопустимый символ, такой как 'x', в шрифт имени класса в команде / resetaddin, чтобы его можно было легко включить, удалив x, когда мы хотим выполнить полный сброс. Обычно нет необходимости сбрасывать каждый раз, когда мы отлаживаем!

...