Форма не может получить фокус после потери - PullRequest
4 голосов
/ 10 сентября 2010

Я создал надстройку для Visual Studio 2008, которая открывает форму, используя Form1.Show(this);

Если (пока форма открыта) пользователь открывает / закрывает диалоговое окно Visual Studio (например, Информация о сборке), то пользователь не может вернуться к форме, созданной надстройкой.

Что-то мне не хватает, чтобы позволить пользователю вернуться в форму? Этого не происходит, если я использую Form1.ShowDialog(this), но я бы хотел, чтобы пользователь видел информацию о сборке, пока открыта моя пользовательская форма.

Надстройка реализует IWin32Window с использованием

public System.IntPtr Handle
{
    get
    {
        return new System.IntPtr(_applicationObject.MainWindow.HWnd);
    }
}

РЕДАКТИРОВАТЬ: шаги для воспроизведения

Создание проекта надстройки Visual Studio Добавить ссылку на System.Windows.Forms Добавить следующее к public void Exec(...)
System.Windows.Forms.Form f = new System.Windows.Forms.Form();
f.Show();

Запустите надстройку и откройте проект в запущенном экземпляре Visual Studio Откройте свойства проекта, перейдите на вкладку «Приложение», откройте «Информация о сборке» и закройте его.

Ответы [ 2 ]

5 голосов
/ 15 сентября 2010

Спасибо за шаги воспроизведения. Я смог воспроизвести вашу проблему.

Насколько мне удалось выяснить, в Visual Studio IDE используются элементы управления, а не формы.

Не зная, для чего предназначена ваша форма, я просто добавил базовый пример ниже, чтобы начать.

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

Пользовательский элемент управления

Сначала щелкните правой кнопкой мыши свой проект и добавьте новый пользовательский элемент управления. Я назвал мой «MyForm» в моем примере и поместил на него простую кнопку, отображающую «Hello» при нажатии. Этот пользовательский элемент управления будет вашей формой.

namespace MyAddin1
{
    public partial class MyForm : UserControl
    {
        public MyForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello");
        }
    }
}

Создание формы

Нам нужно использовать приложение, в котором размещается ваш AddIn, и экземпляр вашего AddIn. Оба они уже объявлены в вашем проекте AddIn: _applicationObject и _addInInstance. Они устанавливаются в событии OnConnection.

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

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

/// <summary>Implements the Exec method of the IDTCommandTarget interface. This is called when the command is invoked.</summary>
/// <param term='commandName'>The name of the command to execute.</param>
/// <param term='executeOption'>Describes how the command should be run.</param>
/// <param term='varIn'>Parameters passed from the caller to the command handler.</param>
/// <param term='varOut'>Parameters passed from the command handler to the caller.</param>
/// <param term='handled'>Informs the caller if the command was handled or not.</param>
/// <seealso class='Exec' />
public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
    object tempObject = null;   // It's required but I'm not sure what one can do with it...
    Windows2 windows2 = null;   // Reference to the window collection displayed in the application host.
    Assembly asm = null;        // The assembly containing the user control.
    Window myWindow = null;     // Will contain the reference of the new Tool Window.

    try
    {
        handled = false;

        if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
        {
            if (commandName == "MyAddin1.Connect.MyAddin1")
            {
                handled = true;

                // Get a reference to the window collection displayed in the application host.
                windows2 = (Windows2)_applicationObject.Windows;

                // Get the executing assembly.
                asm = Assembly.GetExecutingAssembly();

                // Create the tool window and insert the user control.
                myWindow = windows2.CreateToolWindow2(_addInInstance, asm.Location, "MyAddin1.MyForm", "My Tool Window", "{CB2AE2BD-2336-4615-B0A3-C55B9C7794C9}", ref tempObject);

                // Set window properties to make it act more like a modless form.
                myWindow.Linkable = false;  // Indicates whether the window can be docked with other windows in the IDE or not.
                myWindow.IsFloating = true; // Indicates whether the window floats over other windows or not.

                // Show the window.
                myWindow.Visible = true;

                return;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Я протестировал приложение, оно добавило мою надстройку в меню инструментов IDE, и когда я щелкнул свой Addin, оно показало окно, и оно заработало. Он также не зависал, не зависал и ничего при отображении диалога сборки.

1 голос
/ 14 сентября 2010
...