.Net Framework 4.7 için Uygulamanızı hedefleyin ve Windows 10 v1703 (Creators Update Build 15063) altında çalıştırın. Windows 10 (v1703) altındaki .Net 4.7 ile MS, birçok DPI iyileştirmesi yaptı .
.NET Framework 4.7'den başlayarak, Windows Forms yaygın yüksek DPI ve dinamik DPI senaryoları için geliştirmeler içerir. Bunlar:
MonthCalendar denetimi ve CheckedListBox denetimi gibi bir dizi Windows Forms denetiminin ölçeklendirilmesi ve düzenindeki geliştirmeler.
Tek geçişli ölçekleme. .NET Framework 4.6 ve önceki sürümlerinde, ölçekleme birden çok geçişle gerçekleştirildi ve bu da bazı kontrollerin gereğinden fazla ölçeklenmesine neden oldu.
Bir Windows Forms uygulaması başlatıldıktan sonra kullanıcının DPI veya ölçek faktörünü değiştirdiği dinamik DPI senaryoları desteği.
Bunu desteklemek için uygulamanıza bir uygulama bildirimi ekleyin ve uygulamanızın Windows 10'u desteklediğini işaret edin:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Sonra, ekleyin app.config
ve uygulamayı Başına Monitör Haberdar. Bu ŞİMDİ app.config içinde yapılır ve daha önce olduğu gibi manifestte DEĞİLDİR!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Bu PerMonitorV2 , Windows 10 Creators Güncellemesinden bu yana yenidir:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Monitör Başına v2 olarak da bilinir. Uygulamaların en üst düzey pencere temelinde yeni DPI ile ilgili ölçeklendirme davranışlarına erişmesini sağlayan, monitör başına orijinal DPI farkındalık modu üzerinde bir ilerleme.
Alt pencere DPI değişiklik bildirimleri - Monitör Başına v2 bağlamlarında, tüm pencere ağacında meydana gelen tüm DPI değişiklikleri bildirilir.
İstemci olmayan alanın ölçeklendirilmesi - Tüm pencerelerde otomatik olarak DPI duyarlı bir şekilde çizilir. EnableNonClientDpiScaling çağrıları gereksizdir.
S Win32 menülerin caling - Başına Monitor v2 bağlamlarda oluşturulan tüm NTUSER menüleri başına monitör moda ölçekleme edilecektir.
İletişim Kutusu Ölçekleme - Monitör Başına v2 bağlamlarında oluşturulan Win32 iletişim kutuları otomatik olarak DPI değişikliklerine yanıt verir.
Comctl32 denetimlerinin ölçeklendirmesi iyileştirildi - Çeşitli comctl32 denetimleri, Monitör Başına v2 bağlamlarında gelişmiş DPI ölçeklendirme davranışına sahiptir.
Geliştirilmiş tema davranışı - Monitör Başına v2 penceresi bağlamında açılan UxTheme tutamaçları, bu pencereyle ilişkili DPI açısından çalışır.
Artık DPI değişiklikleri hakkında bildirim almak için 3 yeni etkinliğe abone olabilirsiniz:
Ateşlenen Control.DpiChangedAfterParent , bir denetimin DPI ayarı, üst denetimi veya formu için bir DPI değişiklik olayı gerçekleştikten sonra programlı olarak değiştirildiğinde ortaya çıkar.
Bir denetimin DPI ayarı, üst denetimi veya formu için bir DPI değişiklik olayı gerçekleşmeden önce programlı olarak değiştirildiğinde tetiklenen Control.DpiChangedBeforeParent .
Form.DpiChanged , formun görüntülenmekte olduğu görüntü aygıtında DPI ayarı değiştiğinde tetiklenir.
DPI işleme / ölçeklendirme hakkında 3 yardımcı yönteminiz de vardır:
Bir değeri mantıksaldan aygıt piksellerine dönüştüren Control.LogicalToDeviceUnits .
Control.ScaleBitmapLogicalToDeviceBitmap görüntüsünü bir aygıtın mantıksal DPI'sına ölçeklendiren .
Geçerli aygıtın DPI'sını döndüren Control.DeviceDpi .
Hâlâ sorun görüyorsanız, app.config girişleri aracılığıyla DPI geliştirmelerinden çıkabilirsiniz .
Kaynak koduna erişiminiz yoksa, Windows Gezgini'nde uygulama özelliklerine gidebilir, uyumluluğa gidebilir ve System (Enhanced)
DPI işlemeyi de iyileştirmek için GDI ölçeklendirmeyi etkinleştirir:
GDI tabanlı Windows uygulamaları için artık bunları monitör başına ölçeklendirebilir. Bu, bu uygulamaların sihirli bir şekilde izlenen DPI başına farkında olacağı anlamına gelir.
Tüm bu adımları uygulayın ve WinForms uygulamaları için daha iyi bir DPI deneyimi edinmelisiniz. Ancak, uygulamanızı .net 4.7 için hedeflemeniz ve en azından Windows 10 Build 15063'e (İçerik Oluşturucu Güncellemesi) ihtiyacınız olduğunu unutmayın. Bir sonraki Windows 10 Güncelleştirme 1709'da daha fazla iyileştirme alabiliriz.
NumericUpDown
Margin
doğru şekilde ölçeklemiyor . Marj iki kez ölçeklendirilmiş gibi görünüyor. Bir kez daha ölçeklendirirsem iyi görünüyor.