从VSTO Outlook加载项生成的居中WPF对话框

时间:2012-02-21 23:42:55

标签: wpf vsto outlook-addin caliburn.micro

我正在开发一个Outlook 2010加载项,它为用户输入提供了一个对话框。在功能区中显示按钮所需的代码位于其自己的Outlook 2010外接程序项目中。该项目引用了WPF用户控件库,该库负责大部分工作。

我在WPF用户控件库项目中使用静态方法,该方法负责正确配置Caliburn.Micro并显示对话框。所有这些都按预期工作,除了我无法弄清楚如何正确定位对话框。我希望它显示在Outlook窗口的中心。我知道我可以访问Microsoft.Office.Interop.Outlook.Application.ActiveWindow(),但我看不出这对我有什么帮助,因为我无法按照Caliburn.Micro WindowManager的ShowDialog方法的设置将其翻译为PlacementTarget

WPF用户控件库

namespace WpfUserControlLibrary {
    public static class Connector {
        public static void ShowDialog() {
            new AppBootstrapper();
            var windowManager = IoC.Get<IWindowManager>();
            windowManager.ShowDialog( new ShellViewModel() );
        }
    }
}

Outlook 2010加载项

WpfUserControlLibrary.Connector.ShowDialog();

1 个答案:

答案 0 :(得分:4)

我能够找到解决方案。感谢this question的帮助,我能够将相应的父窗口位置和大小参数传递给连接器。我检查了Caliburn.Micro源代码,发现我实际上是在创建一个ChildWindow - 而不是Popup。因此,我只需要设置对话框设置的TopLeft值。

WPF用户控件库

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

Outlook 2010加载项

var win = ThisAddIn.Application.ActiveWindow();
var parent = new System.Windows.Rect(win.Left, win.Top, win.Width, win.Height);
WpfUserControlLibrary.Connector.ShowDialog(parent);