2011-08-03 71 views
10

コンピュータでデフォルトのDPI設定が使用されていない場合、WPFの座標が実際の画面座標(ピクセル座標)と異なることを理解しています。私のプログラムでは、(1)WPFウィンドウがどちらのモニタにあるかを把握し、(2)同じモニタの左下隅に別のウィンドウを開きたい。WPF:画面座標とWPF座標の変換

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

しかし、他のDPIで、両方の手順が正しく動作し、置いてもよい:デフォルトの96 DPIで正常に動作され、次のように私は、WPFのために私はWinFormsのバージョンを使用Screenのない等価ではありません聞きましたウィンドウは完全にオフスクリーンです。私は最初の部分のため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; 

は、私はそれが正常に国境を占めないかもしれないとして、これはかなり右であるかはわかりません。しかし、第二の部分はより重要です。 LeftとTopを正しく設定するために、スクリーン矩形「scr」をWPF空間に変換するにはどうすればよいですか?

+2

ありません複数のモニタをサポートしていることを確認してくださいn SystemParametersクラスを使用しているWindowsフォーム(DPI対応ではない)への参照なしにWPF(DPI対応)のみを使用するプライマリ画面。関連するプロパティは、異なるDPI設定に自動的に調整されます。例:window.Top = SystemParameters.FullPrimaryScreenHeight - (window.ActualHeight - SystemParameters.WindowCaptionHeight); // VistaとWindows 7で動作し、XPについて知りません。 –

答えて

25
  1. である:

    private static Screen GetScreen(Window window) 
    { 
        return Screen.FromHandle(new WindowInteropHelper(window).Handle); 
    } 
    
  2. オープン同じ画面の左下隅にある別のウィンドウ:

    static Point RealPixelsToWpf(Window w, Point p) 
    { 
        var t = PresentationSource.FromVisual(w).CompositionTarget.TransformFromDevice; 
        return t.Transform(p); 
    } 
    private static void SetPositionBottomLeftCorner(Window sourceWindow, Window targetWindow) 
    { 
        var workingArea = GetScreen(sourceWindow).WorkingArea; 
        var corner = RealPixelsToWpf(sourceWindow, new Point(workingArea.Left, workingArea.Bottom)); 
        targetWindow.Left = corner.X; 
        targetWindow.Top = corner.Y - targetWindow.ActualHeight; 
    } 
    
+2

RealPixelsToWpf()ヘルパーメソッドを追加しました。 – Qwertie

2

これは、ウィンドウのコードビハインドに配置すると機能しますか? WPFウィンドウを画面

protected override void OnContentRendered(System.EventArgs e) 
{ 
    base.OnContentRendered(e); 
    MoveToLowerRightCorner(); 
} 

private void MoveToLowerRightCorner() 
{ 
    var workingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea; 
    var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice; 
    var corner = transform.Transform(new Point(workingArea.Right, workingArea.Bottom)); 
    this.Left = corner.X - this.ActualWidth; 
    this.Top = corner.Y - this.ActualHeight; 
} 
関連する問題