Tôi hiểu rằng các tọa độ WPF khác với tọa độ màn hình "thực" (tọa độ pixel) nếu máy tính không sử dụng cài đặt DPI mặc định. Trong chương trình của tôi, tôi muốn (1) tìm ra màn hình một cửa sổ WPF đang bật và (2) mở một cửa sổ khác ở góc dưới bên trái của cùng một màn hình. Tôi nghe nói không có tương đương với Screen cho WPF vì vậy tôi sử dụng phiên bản WinForms, như sau, trong đó hoạt động tốt ở mặc định 96 DPI:WPF: Chuyển đổi giữa các tọa độ màn hình và tọa độ 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;
}
Nhưng tại Sở KHĐT khác, cả hai bước làm việc không đúng cách, và có thể đặt cửa sổ hoàn toàn tắt màn hình.
Cho đến nay, có vẻ như tôi có thể sử dụng Visual.PointToScreen cho phần đầu tiên:
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;
Tôi không chắc chắn nếu điều này là hoàn toàn đúng, vì nó có thể không chiếm biên giới một cách chính xác. Nhưng phần thứ hai quan trọng hơn. Làm thế nào để chuyển đổi hình chữ nhật màn hình "scr" vào không gian WPF, để thiết lập trái và đầu chính xác?
Không chắc chắn về hỗ trợ nhiều màn hình, nhưng bạn có thể định vị chính xác cửa sổ của bạn o n màn hình chính chỉ sử dụng WPF (là nhận thức của DPI) mà không có bất kỳ tham chiếu nào đến các Biểu mẫu Windows (mà không phải là nhận thức của DPI) bằng cách sử dụng lớp SystemParameters. Các thuộc tính liên quan sẽ tự động điều chỉnh theo các thiết lập DPI khác nhau. Ví dụ: window.Top = SystemParameters.FullPrimaryScreenHeight - (window.ActualHeight - SystemParameters.WindowCaptionHeight); // Làm việc trên Vista và Windows 7, không biết về XP. –