设置Caliburn IWindowmanager';使用句柄HWND将的所有者属性设置为Excel

设置Caliburn IWindowmanager';使用句柄HWND将的所有者属性设置为Excel,excel,vsto,caliburn.micro,Excel,Vsto,Caliburn.micro,我有一个Excel Vsto加载项应用程序,其中我使用Calibrun Micro Autofac托管WPF应用程序构建。我有一个弹出Excel的对话框,我希望该弹出窗口的所有者设置为该Excel窗口。我看到的唯一方法是使用需要窗口实例的WindowInteropHelper类 我使用的设置如下: dynamic settings = new ExpandoObject(); windowManager.ShowDialog(viewModel, settings: settings); 我

我有一个Excel Vsto加载项应用程序,其中我使用Calibrun Micro Autofac托管WPF应用程序构建。我有一个弹出Excel的对话框,我希望该弹出窗口的所有者设置为该Excel窗口。我看到的唯一方法是使用需要窗口实例的WindowInteropHelper类

我使用的设置如下:

dynamic settings = new ExpandoObject();
windowManager.ShowDialog(viewModel, settings: settings);
我把窗户展示成这样:

dynamic settings = new ExpandoObject();
windowManager.ShowDialog(viewModel, settings: settings);

那么,我应该如何将settings.Owner属性设置到此excel窗口(其句柄是已知的),以便弹出窗口始终位于excel窗口的顶部???

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

class MyBootstrapper : BootstrapperBase {
    MyBootstrapper()
        : base(false)
    {
    }
}
然后Caliburn.Micro将为您正确设置所有者属性,您无需担心。现在,如果你知道这一点,但它没有工作,然后评论这一点,我会给你一个具体的解决方案,你的情况

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

  • 将信息添加到创建的窗口中,以便我们以后可以识别它,我们可以这样做:
  • var设置=新的ExpandoObject()
  • settings.Tag=“THE_ONE”
  • windowManager.ShowDialog(视图模型,设置:设置)
  • 这样做之后,我们需要获得该窗口的引用,以便 这样做:
    var-ourWindow=Application.Current.Windows.FirstOrDefault(w=>w.Tag==“theu ONE”)
  • 现在我们用一个
    WindowInteropHelper
    像这样包装它:
    var
    interopHelper=新窗口interopHelper(我们的窗口)
  • 现在我们可以将所有者设置为本机窗口句柄,如下所示:
    interopHelper.Owner=(IntPtr)//
    把你的本地窗口把手放在这里

  • 这就是我能帮你的全部,我希望它能起作用。

    是的,我正在做这样的事情:受保护的AutofacBootstrapper():base(false)@vinaysingri,我已经编辑了答案,请检查编辑。效果很好:)谢谢!!