看起来您在 Excel 中托管了一个 WPF 应用程序(加载项),它是一个 Office 应用程序,而 Caliburn.Micro 在BootstrapperBase
类中有一个专门针对这种情况的构造函数,它看起来像这样:BootstrapperBase(useApplication = true)
,所以您应该从中派生引导程序BootstrapperBase
并通过进入false
基础构造函数。像这样的东西:
class MyBootstrapper : BootstrapperBase {
MyBootstrapper()
: base(false)
{
}
}
然后 Caliburn.Micro 将为您正确设置所有者属性,您不必担心。现在,如果您知道这一点但它不起作用,请对此发表评论,我将为您提供针对您的具体情况的解决方案。
编辑:要设置已创建窗口的所有者,我们需要设置Owner
属性(类型为Window
),但问题是您正在使用本机 win32 窗口,因此您只有一个句柄,而 WPF 窗口不接受句柄作为所有者,第二个问题是我们没有对创建的窗口的引用,因此我们可以将其包装在 aWindowInteropHelper
中,为了解决这个问题,我建议如下:
- 将信息添加到创建的窗口,以便我们稍后识别它,我们可以这样做:
var settings = new ExpandoObject();
settings.Tag = "THE_ONE"
windowManager.ShowDialog(viewModel, settings: settings);
- 这样做之后,我们需要获取对该窗口的引用,因此我们可以执行以下操作:
var ourWindow = Application.Current.Windows.FirstOrDefault(w => w.Tag == "THE_ONE");
- 现在我们用这样的方式包装它
WindowInteropHelper
:var
interopHelper = new WindowInteropHelper(ourWindow);
- 现在我们可以像这样将所有者设置为本机窗口句柄:
interopHelper.Owner = (IntPtr) //
PUT_YOUR_NATIVE_WINDOW_HANDLE_HERE;
这就是我能帮助你的全部,我希望它有效。