加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何将所有者窗口传递给Show()方法重载?

发布时间:2020-12-15 18:05:14 所属栏目:百科 来源:网络整理
导读:我正在使用Excel添加,在用户单击功能区栏上的按钮后打开一个winform.此按钮需要是非模态的,以便用户仍然可以与父窗口进行交互,但它也必须始终保持在父窗口的顶部.为了实现这一点,我试图将父窗口作为参数传递给Show()方法.这是我的代码: Ribbon1.cs private
我正在使用Excel添加,在用户单击功能区栏上的按钮后打开一个winform.此按钮需要是非模态的,以便用户仍然可以与父窗口进行交互,但它也必须始终保持在父窗口的顶部.为了实现这一点,我试图将父窗口作为参数传递给Show()方法.这是我的代码:

Ribbon1.cs

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

        newForm.Show(this);
    }

这段代码的问题是“this”这个词引用了ribbon类,而不是父窗口.我也试过传入Globals.ThisAddIn.Application.Windows.Parent.这导致运行时错误“’System.Windows.Forms.Form.Show(System.Windows.Forms.IWin32Window)’的最佳重载方法匹配’具有一些无效参数”.将父窗口传递给Show()的正确方法是什么?

如果它是相关的,这是一个使用C#在.NET 4.0上编写的Office 2010应用程序.

编辑—基于Slaks答案

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));
        }

解决方法

您需要创建一个实现IWin32Window的类并返回Excel的Application.Hwnd属性.

例如:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读