【问题标题】:Setting Caliburn IWindowmanager's Owner Property to Excel with handle HWND使用句柄 HWND 将 Caliburn IWindowmanager 的 Owner 属性设置为 Excel
【发布时间】:2013-07-08 23:28:42
【问题描述】:

我有一个 Excel Vsto 插件应用程序,我在其中托管使用​​ Calibrun Micro Autofac 构建的 WPF 应用程序。我有一个弹出 excel 的对话框,我希望将弹出窗口的所有者设置为此 excel 窗口。我看到的唯一方法这样做是使用需要 Window 实例的 WindowInteropHelper 类。

我正在使用这样的设置:

dynamic settings = new ExpandoObject();

我这样显示窗口:

windowManager.ShowDialog(viewModel, settings: settings);

那么我应该怎么做才能将 settings.Owner 属性设置为这个 excel 窗口(谁的句柄是已知的),以便弹出窗口总是在 excel 窗口的顶部??

【问题讨论】:

    标签: excel vsto caliburn.micro


    【解决方案1】:

    看起来您在 Excel 中托管了一个 WPF 应用程序(加载项),它是一个 Office 应用程序,而 Caliburn.Micro 在BootstrapperBase 类中有一个构造函数,正是针对这种情况,它看起来像这样:BootstrapperBase(useApplication = true),所以你应该从BootstrapperBase 派生你的引导程序并将false 传递给基本构造函数。像这样:

    class MyBootstrapper : BootstrapperBase {
        MyBootstrapper()
            : base(false)
        {
        }
    }
    

    然后 Caliburn.Micro 将为您正确设置所有者属性,您不必担心。现在,如果您知道这一点但它不起作用,请对此发表评论,我将为您提供针对您的具体情况的解决方案。

    编辑:要设置所创建窗口的所有者,我们需要设置Owner 属性(类型为Window 但问题是您正在使用本机 win32 窗口,因此您只有一个句柄,而 WPF 窗口不接受句柄作为所有者,第二个问题是我们没有对创建的窗口的引用,因此我们可以将其包装在 @ 987654328@,为了解决这个问题,我建议如下:

    1. 向创建的窗口添加信息,以便我们以后识别它,我们可以这样做:
      1. var settings = new ExpandoObject();
      2. settings.Tag = "THE_ONE"
      3. windowManager.ShowDialog(viewModel, settings: settings);
    2. 这样做之后,我们需要获得对该窗口的引用,这样我们就可以 做这样的事情:var ourWindow = Application.Current.Windows.FirstOrDefault(w => w.Tag == "THE_ONE");
    3. 现在我们用WindowInteropHelper 包装它,如下所示:var interopHelper = new WindowInteropHelper(ourWindow);
    4. 现在我们可以像这样将所有者设置为本机窗口句柄: interopHelper.Owner = (IntPtr) // PUT_YOUR_NATIVE_WINDOW_HANDLE_HERE;

    这就是我能帮你的全部了,我希望它有效。

    【讨论】:

    • 是的,我正在做这样的事情:受保护的 AutofacBootstrapper() : base(false)
    • @vinaysingri,我已经编辑了答案,请检查编辑。
    • 像魅力一样工作 :) 非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    相关资源
    最近更新 更多