WPF: преобразование экранных координат в WPF-координаты

Я понимаю, что координаты WPF отличаются от "реальных" экранных координат (пиксельных координат), если компьютер не использует настройку DPI по умолчанию. В моей программе я хочу (1) выяснить, на каком мониторе включено окно WPF, и (2) открыть другое окно в нижнем левом углу того же монитора. Я слышал, что нет эквивалента Screen для WPF, поэтому я использую версию WinForms, как показано ниже, которая отлично работает при разрешении 96 точек на дюйм по умолчанию:

public void ChooseInitialPosition(Window w) // w is some other window
{
    var scr = System.Windows.Forms.Screen.FromRectangle(
          new System.Drawing.Rectangle((int)w.Left, (int)w.Top, (int)w.Width, (int)w.Height))
          .WorkingArea;

    this.Left = scr.Right - Width;
    this.Top = scr.Bottom - Height;
}

Но при других точках на дюйм оба шага работают неправильно и могут полностью убрать окно за пределы экрана.

Пока что, похоже, я могу использовать Visual.PointToScreen для первой части:

var p1 = w.PointToScreen(new Point(0,0));
var p2 = w.PointToScreen(new Point(w.Width,w.Height));
var scr = System.Windows.Forms.Screen.FromRectangle(
    new System.Drawing.Rectangle((int)p1.X, (int)p1.Y, (int)(p2.X - p1.X), (int)(p2.Y - p1.Y))).WorkingArea;

Я не уверен, правильно ли это, так как это может неправильно учитывать границы. Но вторая часть важнее. Как мне преобразовать прямоугольник экрана «scr» в пространство WPF, чтобы правильно установить Left и Top?

11
задан Qwertie 12 August 2011 в 20:11
поделиться