Nhắm mục tiêu Ứng dụng của bạn cho .Net Framework 4.7 và chạy nó trong Windows 10 v1703 (Creators Update Build 15063). Với .Net 4.7 trong Windows 10 (v1703), MS đã thực hiện rất nhiều cải tiến DPI .
Bắt đầu với .NET Framework 4.7, Windows Forms bao gồm các cải tiến cho các kịch bản DPI cao và DPI động phổ biến. Bao gồm các:
Các cải tiến về tỷ lệ và bố cục của một số điều khiển Windows Forms, chẳng hạn như điều khiển MonthCalWiki và điều khiển CheckedListBox.
Chia tỷ lệ đơn. Trong .NET Framework 4.6 và các phiên bản trước đó, việc chia tỷ lệ được thực hiện qua nhiều lần, điều này khiến một số điều khiển được thu nhỏ hơn mức cần thiết.
Hỗ trợ cho các kịch bản DPI động trong đó người dùng thay đổi DPI hoặc hệ số tỷ lệ sau khi ứng dụng Windows Forms được khởi chạy.
Để hỗ trợ nó, hãy thêm một bảng kê khai ứng dụng vào ứng dụng của bạn và báo hiệu rằng ứng dụng của bạn hỗ trợ Windows 10:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Tiếp theo, thêm một app.config
và khai báo ứng dụng Per Monitor Aware. Điều này NGAY BÂY GIỜ được thực hiện trong app.config và KHÔNG trong bảng kê khai như trước đây!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
PerMonitorV2 này là mới kể từ Windows 10 Tạo Lập Cập nhật:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Còn được gọi là Per Monitor v2. Một tiến bộ so với chế độ nhận thức DPI trên mỗi màn hình gốc, cho phép các ứng dụng truy cập các hành vi mở rộng liên quan đến DPI mới trên cơ sở cửa sổ cấp cao nhất.
Thông báo thay đổi cửa sổ con DPI - Trong bối cảnh Per Monitor v2, toàn bộ cây cửa sổ được thông báo về mọi thay đổi DPI xảy ra.
Thu nhỏ khu vực không dành cho khách hàng - Tất cả các cửa sổ sẽ tự động có khu vực không dành cho khách hàng của họ được vẽ theo kiểu nhạy cảm DPI. Các cuộc gọi đến EnableNonClientDpiScaling là không cần thiết.
S caling của menu Win32 - menu Tất cả NTUSER tạo ra trong bối cảnh mỗi Monitor v2 sẽ được nhân rộng trong một thời trang mỗi màn hình.
Mở rộng hộp thoại - Các hộp thoại Win32 được tạo trong bối cảnh Per Monitor v2 sẽ tự động trả lời các thay đổi DPI.
Cải thiện tỷ lệ điều khiển comctl32 - Các điều khiển comctl32 khác nhau đã cải thiện hành vi chia tỷ lệ DPI trong bối cảnh Per Monitor v2.
Cải thiện hành vi theo chủ đề - Các tay cầm UxTheme được mở trong ngữ cảnh của cửa sổ Per Monitor v2 sẽ hoạt động theo DPI được liên kết với cửa sổ đó.
Bây giờ bạn có thể đăng ký 3 sự kiện mới để nhận thông báo về các thay đổi DPI:
Control.DpiChangedAfterParent , được kích hoạt Xảy ra khi cài đặt DPI cho điều khiển được thay đổi theo chương trình sau khi xảy ra sự kiện thay đổi DPI cho điều khiển hoặc biểu mẫu chính của nó.
Control.DpiChangedB BeforeParent , được kích hoạt khi cài đặt DPI cho điều khiển được thay đổi theo chương trình trước khi xảy ra sự kiện thay đổi DPI cho điều khiển hoặc biểu mẫu mẹ của nó.
Form.DpiChanged , được kích hoạt khi cài đặt DPI thay đổi trên thiết bị hiển thị nơi biểu mẫu hiện đang được hiển thị.
Bạn cũng có 3 phương thức trợ giúp về xử lý / chia tỷ lệ DPI:
Control.LogicalToDeviceUnits , chuyển đổi một giá trị từ logic sang pixel thiết bị.
Control.ScaleBitmapLogicalToDevice , chia tỷ lệ hình ảnh bitmap thành DPI logic cho thiết bị.
Control.DeviceDpi , trả về DPI cho thiết bị hiện tại.
Nếu bạn vẫn thấy sự cố, bạn có thể từ chối các cải tiến DPI thông qua các mục app.config .
Nếu bạn không có quyền truy cập vào mã nguồn, bạn có thể truy cập các thuộc tính ứng dụng trong Windows Explorer, đi đến tính tương thích và chọn System (Enhanced)
kích hoạt quy mô GDI để cải thiện xử lý DPI:
Đối với các ứng dụng Windows dựa trên GDI giờ đây có thể mở rộng quy mô DPI trên cơ sở mỗi màn hình. Điều này có nghĩa là các ứng dụng này, một cách kỳ diệu, sẽ trở thành nhận thức DPI trên màn hình.
Thực hiện tất cả các bước đó và bạn sẽ có được trải nghiệm DPI tốt hơn cho các ứng dụng WinForms. Nhưng hãy nhớ rằng, bạn cần nhắm mục tiêu ứng dụng của mình cho .net 4.7 và cần ít nhất Windows 10 Build 15063 (Cập nhật người tạo). Trong Windows 10 Update 1709 tiếp theo, chúng tôi có thể nhận được nhiều cải tiến hơn.
NumericUpDown
không đúng quy mô của nóMargin
, quá. Có vẻ như lề được thu nhỏ hai lần. Nếu tôi thu nhỏ lại một lần, nó có vẻ tốt.