我正在开发一个Outlook 2010加载项,它为用户输入提供了一个对话框。在功能区中显示按钮所需的代码位于其自己的Outlook 2010外接程序项目中。该项目引用了WPF用户控件库,该库负责大部分工作。
我在WPF用户控件库项目中使用静态方法,该方法负责正确配置Caliburn.Micro并显示对话框。所有这些都按预期工作,除了我无法弄清楚如何正确定位对话框。我希望它显示在Outlook窗口的中心。我知道我可以访问Microsoft.Office.Interop.Outlook.Application.ActiveWindow()
,但我看不出这对我有什么帮助,因为我无法按照Caliburn.Micro WindowManager的ShowDialog方法的设置将其翻译为PlacementTarget
。
namespace WpfUserControlLibrary {
public static class Connector {
public static void ShowDialog() {
new AppBootstrapper();
var windowManager = IoC.Get<IWindowManager>();
windowManager.ShowDialog( new ShellViewModel() );
}
}
}
WpfUserControlLibrary.Connector.ShowDialog();
答案 0 :(得分:4)
我能够找到解决方案。感谢this question的帮助,我能够将相应的父窗口位置和大小参数传递给连接器。我检查了Caliburn.Micro源代码,发现我实际上是在创建一个ChildWindow
- 而不是Popup
。因此,我只需要设置对话框设置的Top
和Left
值。
namespace WpfUserControlLibrary {
public static class Connector {
public static void ShowDialog(System.Windows.Rect parent) {
new AppBootstrapper();
var windowManager = IoC.Get<IWindowManager>();
// Popup is always 600 x 400
dynamic settings = new System.Dynamic.ExpandoObject();
settings.Left = (parent.Left + parent.Width / 2) - 300;
settings.Top = (parent.Top + parent.Height / 2) - 200;
windowManager.ShowDialog(new ShellViewModel(), settings: settings);
}
}
}
var win = ThisAddIn.Application.ActiveWindow();
var parent = new System.Windows.Rect(win.Left, win.Top, win.Width, win.Height);
WpfUserControlLibrary.Connector.ShowDialog(parent);