กำหนดเป้าหมายแอปพลิเคชันของคุณสำหรับ. Net Framework 4.7 และรันภายใต้ Windows 10 v1703 (ผู้สร้างอัปเดตผู้สร้าง 15063) กับสุทธิ 4.7 ภายใต้ Windows 10 (v1703), MS ทำมากของการปรับปรุง
เริ่มต้นด้วย. NET Framework 4.7, Windows Forms มีการปรับปรุงสำหรับ DPI สูงทั่วไปและสถานการณ์ DPI แบบไดนามิก เหล่านี้รวมถึง:
การปรับปรุงในมาตราส่วนและเค้าโครงของตัวควบคุมฟอร์ม Windows จำนวนหนึ่งเช่นตัวควบคุม MonthCalendar และตัวควบคุม CheckedListBox
การปรับสเกลผ่านครั้งเดียว ใน. NET Framework 4.6 และเวอร์ชันก่อนหน้านี้การปรับสเกลถูกดำเนินการผ่านการส่งหลายครั้งซึ่งทำให้การควบคุมบางอย่างถูกปรับขนาดมากกว่าที่จำเป็น
รองรับสถานการณ์ DPI แบบไดนามิกที่ผู้ใช้เปลี่ยน DPI หรือตัวประกอบสเกลหลังจากเปิดใช้งานแอปพลิเคชัน Windows Forms
หากต้องการสนับสนุนให้เพิ่มรายการแอปพลิเคชันลงในแอปพลิเคชันของคุณและส่งสัญญาณว่าแอปของคุณรองรับ Windows 10:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
ถัดไปเพิ่มapp.config
และประกาศแอพต่อการตรวจสอบรอบรู้ ตอนนี้เสร็จแล้วในแอปตั้งค่าและไม่แสดงในรายการเหมือนก่อน!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
PerMonitorV2นี้เป็นของใหม่ตั้งแต่ Windows 10 ผู้สร้างอัพเดท:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
หรือที่รู้จักในชื่อ Per Monitor v2 ความก้าวหน้าเหนือกว่าโหมดการรับรู้ DPI ต่อจอภาพดั้งเดิมซึ่งช่วยให้แอปพลิเคชันเข้าถึงพฤติกรรมการปรับขนาดที่เกี่ยวข้องกับ DPI ใหม่บนพื้นฐานหน้าต่างระดับบนสุด
หน้าต่างลูก DPI แจ้งเตือนการเปลี่ยนแปลง - ในบริบทการตรวจสอบ v2 โครงสร้างหน้าต่างทั้งหมดจะได้รับแจ้งการเปลี่ยนแปลง DPI ใด ๆ ที่เกิดขึ้น
การปรับขนาดของพื้นที่ที่ไม่ใช่ลูกค้า - หน้าต่างทั้งหมดจะดึงพื้นที่ที่ไม่ใช่ลูกค้าโดยอัตโนมัติในรูปแบบที่ละเอียดอ่อน DPI การโทรไปที่ EnableNonClientDpiScaling นั้นไม่จำเป็น
การทำเมนู Win32 ทุกเมนู - เมนู NTUSER ทั้งหมดที่สร้างขึ้นในบริบทการตรวจสอบ v2 จะถูกปรับอัตราส่วนในแบบต่อจอภาพ
กล่องโต้ตอบการปรับมาตราส่วน - กล่องโต้ตอบ Win32 ที่สร้างขึ้นในบริบทการตรวจสอบ v2 จะตอบสนองต่อการเปลี่ยนแปลง DPI โดยอัตโนมัติ
การปรับมาตราส่วนที่ปรับปรุงให้ดีขึ้นของตัวควบคุม comctl32 - ตัวควบคุม comctl32 ที่หลากหลายได้ปรับปรุงพฤติกรรมการปรับสเกล DPI ในบริบทของ Per Monitor v2
ปรับปรุงพฤติกรรมของชุดรูปแบบ - ตัวจัดการ UxTheme ที่เปิดในบริบทของหน้าต่าง Per Monitor v2 จะทำงานในแง่ของ DPI ที่เกี่ยวข้องกับหน้าต่างนั้น
ตอนนี้คุณสามารถสมัครรับ 3 กิจกรรมใหม่เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลง DPI:
Control.DpiChangedAfterParentซึ่งเกิดขึ้นเมื่อการตั้งค่า DPI สำหรับตัวควบคุมถูกเปลี่ยนโดยทางโปรแกรมหลังจากเหตุการณ์การเปลี่ยนแปลง DPI สำหรับตัวควบคุมหลักหรือฟอร์มเกิดขึ้น
Control.DpiChangedBeforeParentซึ่งถูกเรียกใช้เมื่อการตั้งค่า DPI สำหรับตัวควบคุมถูกเปลี่ยนโดยทางโปรแกรมก่อนเหตุการณ์ DPI เปลี่ยนสำหรับการควบคุมหลักหรือฟอร์มเกิดขึ้น
Form.DpiChangedซึ่งจะทำงานเมื่อการตั้งค่า DPI เปลี่ยนแปลงบนอุปกรณ์แสดงผลที่มีการแสดงฟอร์มในปัจจุบัน
คุณมีวิธีช่วยเหลือ 3 วิธีเกี่ยวกับการจัดการ / ปรับ DPI:
Control.LogicalToDeviceUnitsซึ่งแปลงค่าจากโลจิคัลเป็นพิกเซลอุปกรณ์
Control.ScaleBitmapLogicalToDeviceซึ่งปรับขนาดภาพบิตแมปเป็นโลจิคัล DPI สำหรับอุปกรณ์
Control.DeviceDpiซึ่งจะส่งคืน DPI สำหรับอุปกรณ์ปัจจุบัน
หากคุณยังคงเห็นปัญหาคุณสามารถเลือกที่จะปรับปรุง DPI ผ่านรายการ
หากคุณไม่มีสิทธิ์เข้าถึงซอร์สโค้ดคุณสามารถไปที่คุณสมบัติของแอพพลิเคชั่นใน Windows Explorer ไปที่ความเข้ากันได้และเลือก System (Enhanced)
ซึ่งเปิดใช้งานการปรับขนาด GDI เพื่อปรับปรุงการจัดการ DPI ด้วย:
สำหรับแอปพลิเคชันที่ใช้ Windows เป็นแบบ GDI สามารถปรับ DPI เหล่านี้เป็นแบบต่อจอภาพ ซึ่งหมายความว่าแอพพลิเคชั่นเหล่านี้จะรับรู้ DPI ต่อจอภาพอย่างน่าอัศจรรย์
ทำตามขั้นตอนเหล่านั้นทั้งหมดและคุณควรได้รับประสบการณ์ DPI ที่ดีขึ้นสำหรับแอปพลิเคชัน WinForms แต่จำไว้ว่าคุณต้องกำหนดเป้าหมายแอปของคุณสำหรับ. net 4.7 และต้องการ Windows 10 Build 15063 เป็นอย่างน้อย (อัปเดตผู้สร้าง) ใน Windows 10 Update 1709 ถัดไปเราอาจได้รับการปรับปรุงเพิ่มเติม
NumericUpDown
ไม่ปรับขนาดMargin
อย่างเหมาะสมเช่นกัน ดูเหมือนว่าจะได้รับการปรับขนาดสองครั้ง ถ้าฉันปรับขนาดมันอีกครั้งมันก็ดูดี