Я понимаю требования.
Дело в том, что есть методы WPF для получения этих значений - но да, один из авторов прав, а не напрямую.
Решение состоит не в том, чтобы обойти все эти обходные пути, а в том, чтобы изменить первоначальный подход в соответствии с принципами чистого проектирования и разработки.
A) Установите начальное главное окно на экран
B) Получить значения для ActualWindow, включая массу полезных методов WPF
C) Вы можете добавить столько Windows, сколько вам нужно, для поведения, которое вы хотите иметь, например, изменение размера, сворачивание чего угодно ... но теперь вы всегда можете получить доступ к загруженному и отображаемому экрану
Пожалуйста, будьте осторожны со следующим примером: вокруг есть некоторый Кодекс, который делает необходимым использование такого подхода, однако он должен работать (он даст вам очки за каждый из углов вашего экрана):
Рабочий пример для одного, двух мониторов и разных разрешений (в пределах класса основного основного окна):
InitializeComponent();
[…]
ActualWindow.AddHandler(Window.LoadedEvent, new RoutedEventHandler(StartUpScreenLoaded));
перенаправленное событие:
private void StartUpScreenLoaded(object sender, RoutedEventArgs e)
{
Window StartUpScreen = sender as Window;
// Dispatcher Format B:
Dispatcher.Invoke(new Action(() =>
{
// Get Actual Window on Loaded
StartUpScreen.InvalidateVisual();
System.Windows.Point CoordinatesTopRight = StartUpScreen.TranslatePoint(new System.Windows.Point((StartUpScreen.ActualWidth), (0d)), ActualWindow);
System.Windows.Point CoordinatesBottomRight = StartUpScreen.TranslatePoint(new System.Windows.Point((StartUpScreen.ActualWidth), (StartUpScreen.ActualHeight)), ActualWindow);
System.Windows.Point CoordinatesBottomLeft = StartUpScreen.TranslatePoint(new System.Windows.Point((0d), (StartUpScreen.ActualHeight)), ActualWindow);
// Set the Canvas Top Right, Bottom Right, Bottom Left Coordinates
System.Windows.Application.Current.Resources["StartUpScreenPointTopRight"] = CoordinatesTopRight;
System.Windows.Application.Current.Resources["StartUpScreenPointBottomRight"] = CoordinatesBottomRight;
System.Windows.Application.Current.Resources["StartUpScreenPointBottomLeft"] = CoordinatesBottomLeft;
}), DispatcherPriority.Loaded);
}