Как передать окно владельца перегрузке метода Show ()? - PullRequest
6 голосов
/ 26 декабря 2011

Я работаю над надстройкой Excel, которая открывает winform после того, как пользователь нажимает кнопку на панели ленты.Эта кнопка должна быть немодальной, чтобы пользователь мог по-прежнему взаимодействовать с родительским окном, но она также должна всегда оставаться над родительским окном.Для этого я пытаюсь передать родительское окно в качестве параметра в метод Show ().Вот мой код:

Ribbon1.cs

    private void button2_Click(object sender, RibbonControlEventArgs e)
    {
        RangeSelectForm newForm = new RangeSelectForm();

        newForm.Show(this);
    }

Проблема с этим кодом заключается в том, что слово «this» относится к классу ленты, а не к родительскому окну.Я также попытался передать в Globals.ThisAddIn.Application.Windows.Parent.Это приводит к ошибке во время выполнения «У наилучшего перегруженного метода совпадения для« System.Windows.Forms.Form.Show (System.Windows.Forms.IWin32Window) »есть недопустимые аргументы».Как правильно передать родительское окно в Show ()?

В случае необходимости это приложение Office 2010, написанное на .NET 4.0 с использованием C #.

EDIT ---на основании ответа Слакса

 using Excel = Microsoft.Office.Interop.Excel;

...

        class ArbitraryWindow : IWin32Window
        {
            public ArbitraryWindow(IntPtr handle) { Handle = handle; }
            public IntPtr Handle { get; private set; }
        }

        private void button2_Click(object sender, RibbonControlEventArgs e)
        {
            RangeSelectForm newForm = new RangeSelectForm();
            Excel.Application instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
            newForm.Show(new ArbitraryWindow(instance.Hwnd));
        }

1 Ответ

15 голосов
/ 26 декабря 2011

Вам необходимо создать класс, который реализует IWin32Window и возвращает свойство Application.Hwnd в Excel.

Например:

class ArbitraryWindow : IWin32Window {
    public ArbitraryWindow(IntPtr handle) { Handle = handle; }
    public IntPtr Handle { get; private set; }
}

newForm.Show(new ArbitraryWindow(new IntPtr(Something.Application.Hwnd)));
...