2010-02-10 70 views
23

Tôi sẽ phát hiện các nghị quyết với đoạn mã sau trong WPF:
Vấn đề về độ phân giải màn hình trong WPF?

double height = System.Windows.SystemParameters.PrimaryScreenHeight; 
double width = System.Windows.SystemParameters.PrimaryScreenWidth; 

độ phân giải hiện tại của màn hình của tôi là 1920 * 1200, nhưng height là 960,0 và width là 1536,0 !!!

Có vấn đề gì với nó?
Cảm ơn bạn trước.

Trả lời

32

Hãy nhớ rằng tất cả các vị trí và kích thước WPF đều là điểm nổi với đơn vị 1/96 inch. Không phải pixel. Điều này làm cho độ phân giải thiết kế cửa sổ của bạn độc lập. Làm toán: chiều cao = 960/96 = 10 inch. Với bộ điều hợp video của bạn được đặt thành 120 DPI (120/96 = 125%): 10 * 120 = 1200 pixel. Tương tự cho chiều rộng: 1536/96 * 120 = 1920 pixel.

System.Windows.Forms hoạt động theo đơn vị pixel. Bạn đang nhận được ít hơn 1050 cho chiều cao bởi vì nó trừ đi chiều cao của thanh tác vụ. Nhưng đối với WPF bạn luôn muốn làm việc với 1/96" , không bao giờ pixel.

0
+0

Tôi đã thử nghiệm nó, kết quả là giống với bài đăng đầu tiên của tôi! –

+0

ok thật lạ. Điều gì sẽ xảy ra nếu bạn thay đổi độ phân giải màn hình của bạn từ bảng điều khiển? –

+0

Tôi đã thay đổi độ phân giải thành 1680 * 1050, kết quả: height = 1002.0; width = 1680.0. BTW: DPI là 125% –

1

Hãy thử SystemParameters.FullPrimaryScreenWidth và FullPrimaryScreenHeight, tôi tin rằng PrimaryScreenWidth và Height trả về kích thước của cửa sổ khách hàng có sẵn sau khi gỡ bỏ các thanh công cụ và deskbands khác trên màn hình của bạn.

-1

thử these..i tin rằng đây có thể sửa lỗi .....

System.Windows.Form1.Screen.PrimaryScreen .Bounds.Height; System.Windows.Form1.Screen.PrimaryScreen.Bounds.Widtht;

24

Để triển khai mạnh mẽ hơn, bạn nên tính toán các yếu tố DPI trên hệ thống của bạn và làm việc với các yếu tố đó. là 96, nhưng một số màn hình có thể có các giá trị khác nhau.Hãy xem mã của bạn có thể đang chạy trên màn hình có giá trị DPI khác với 96. Hãy xem xét mã này:

private static void CalculateDpiFactors() 
    { 
     Window MainWindow = Application.Current.MainWindow; 
     PresentationSource MainWindowPresentationSource = PresentationSource.FromVisual(MainWindow); 
     Matrix m = MainWindowPresentationSource.CompositionTarget.TransformToDevice; 
     thisDpiWidthFactor = m.M11; 
     thisDpiHeightFactor = m.M22; 
    } 

Sau đó bạn có thể sử dụng những tỷ lệ để có được những giá trị cuối cùng:

CalculateDpiFactors(); 
double ScreenHeight = SystemParameters.PrimaryScreenHeight * thisDpiHeightFactor; 
double ScreenWidth = SystemParameters.PrimaryScreenWidth * thisDpiWidthFactor; 

Các giá trị của ScreenHeight và ScreenWidth sau đó phải phù hợp với những gì bạn nhìn thấy trong cửa sổ Properties của màn hình của bạn.

+4

Thật tuyệt, nhưng bạn có một cửa sổ trước.Làm thế nào để tính toán DPI không có cửa sổ? Nó sẽ là có thể - dpi là tài sản của máy tính để bàn, không chỉ là cửa sổ. – greenoldman

+0

Cảm ơn bạn điều này rất hữu ích. –

+0

Dường như có một số mã liên quan đến điều này ở đây: https://www.mesta-automation.com/tecniques-scaling-wpf-application/ – Beachwalker

0

Nếu bạn chọn "Sử dụng tỷ lệ DPI kiểu Windows XP", thì giá trị trả về của "Screen.PrimaryScreen.Bounds" là chính xác. Nếu không, giá trị trả về được thu nhỏ theo tỷ lệ bởi giá trị DPI (giá trị mặc định).

Để tìm vào hộp kiểm "DPI Sử dụng Windows XP phong cách", mở rộng "Để làm cho văn bản và trên màn hình mục rõ ràng hơn trong các chương trình không được thiết kế cho DPI cao" liên kết trong liên kết sau: http://windows.microsoft.com/en-us/windows-vista/Make-the-text-on-your-screen-larger-or-smaller

+0

FYI: Liên kết đó giờ đây tự động chuyển sang lời giải thích của Windows 8.x, chứ không phải XP/Vista/Win7 –

0

Vui lòng gọi sau khi cửa sổ của bạn được tải.

public static class Ext 
{ 
    public static Size GetNativePrimaryScreenSize(this Window window) 
    { 
     PresentationSource mainWindowPresentationSource = PresentationSource.FromVisual(window); 
     Matrix m = mainWindowPresentationSource.CompositionTarget.TransformToDevice; 
     var dpiWidthFactor = m.M11; 
     var dpiHeightFactor = m.M22; 
     double screenHeight = SystemParameters.PrimaryScreenHeight * dpiHeightFactor; 
     double screenWidth = SystemParameters.PrimaryScreenWidth * dpiWidthFactor; 

     return new Size(screenWidth, screenHeight); 
    } 
} 
Các vấn đề liên quan