Диалог центрирования WPF порожден из надстройки VSTO Outlook - PullRequest
4 голосов
/ 22 февраля 2012

Я работаю над надстройкой Outlook 2010, которая предоставляет диалог для ввода данных пользователем. Код, необходимый для отображения кнопки на ленте, находится в собственном проекте надстройки Outlook 2010. В этом проекте есть ссылка на библиотеку управления пользователями WPF, которая отвечает за большую часть работы.

Я использую статический метод в проекте библиотеки управления пользователями WPF, который отвечает за правильную настройку Caliburn.Micro и отображение диалогового окна. Все это работает, как и ожидалось, за исключением того, что я не могу понять, как правильно расположить диалог. Я хотел бы, чтобы он отображался по центру окна Outlook. Я знаю, что у меня есть доступ к Microsoft.Office.Interop.Outlook.Application.ActiveWindow(), но я не понимаю, как это мне помогает, поскольку я не могу перевести его на PlacementTarget, как ожидается в настройках для метода Caliburn.Micro WindowManager ShowDialog.

Библиотека управления пользователями 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 Ответ

4 голосов
/ 22 февраля 2012

Мне удалось найти решение. Благодаря помощи в этом вопросе я смог передать в Connector соответствующие параметры местоположения и размера родительского окна. Я проверил источник Caliburn.Micro и заметил, что я на самом деле создаю ChildWindow, а не Popup. Поэтому мне просто нужно было установить значения Top и Left настроек для диалога.

Библиотека управления пользователями 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);
...