Automatisch schalen

Met automatisch schalen kunnen een formulier en de bijbehorende besturingselementen, ontworpen op één computer met een bepaalde weergaveresolutie of een bepaald lettertype, op een andere computer met een andere weergaveresolutie of een ander lettertype worden weergegeven. Formulieren en besturingselementen worden automatisch slim aangepast in grootte, zodat ze overeenkomen met de standaardvensters van het besturingssysteem en andere toepassingen op de systemen van gebruikers en andere ontwikkelaars. Met automatische schaalaanpassing en visuele stijlen kunnen Windows Forms toepassingen een consistent uiterlijk behouden in vergelijking met systeemeigen Windows toepassingen op de computer van elke gebruiker.

Voor het grootste deel werkt automatisch schalen zoals verwacht in Windows Forms. Wijzigingen in lettertypeschema's kunnen echter problematisch zijn. Voor een voorbeeld van hoe u dit probleem kunt oplossen, raadpleegt u Instructies: Reageren op wijzigingen in lettertypeschema's in een Windows Forms-toepassing.

DPI-bewustzijn in .NET

DPI-bewustzijn wordt in het projectbestand geconfigureerd via de eigenschap ApplicationHighDpiMode, die standaard op SystemAware is ingesteld. Deze configuratie werkt met het bootstrapsysteem van de toepassing om dpi-verwerking automatisch te configureren wanneer uw toepassing wordt gestart.

De standaard- en aanbevolen DPI-modus voor Windows Forms toepassingen isSystemAware. Deze modus vraagt de DPI-instelling eenmaal bij het opstarten van de toepassing op en gebruikt die waarde gedurende de levensduur van de toepassing, waardoor consistent schaalgedrag wordt geboden.

DPI-modus configureren in uw projectbestand:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
  </PropertyGroup>
</Project>

Note

Hoewel de aanbevolen methode is om DPI te configureren via het projectbestand, kunt u nog steeds een manifestbestand van een toepassing (app.manifest) gebruiken om deze instellingen te overschrijven. Het gebruik van het manifest wordt echter afgeraden omdat dit conflicten kan veroorzaken met de toepassingsconfiguratie. Zie Compilerwaarschuwing WFO0003 voor meer informatie.

overwegingen voor Visual Studio ontwerper

Wanneer u formulieren in Visual Studio ontwerpt, moet u mogelijk de DPI-kennis van de ontwerper afzonderlijk van uw toepassing configureren. Vanaf versie 17.8 van Visual Studio 2022 kunt u de eigenschap ForceDesignerDPIUnaware in uw projectbestand instellen om de Windows Forms-ontwerpfunctie in DPI-onbewuste modus uit te voeren. Met deze instelling voorkomt u renderingproblemen bij het ontwerpen van formulieren op high-DPI-beeldschermen:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
  </PropertyGroup>
</Project>

Deze eigenschap is alleen van invloed op de Visual Studio designer en verandert niet hoe uw toepassing wordt uitgevoerd. Zie DPI-bewustzijn uitschakelen om problemen met schalen op te lossen voor meer informatie.

Beschikbare DPI-modi zijn:

  • SystemAware— De toepassing vraagt de DPI eenmaal bij het opstarten op en gebruikt deze waarde voor de levensduur van de app.
  • PerMonitor— De toepassing controleert op DPI-wijzigingen per monitor en schaalt opnieuw wanneer DPI verandert.
  • PerMonitorV2— Vergelijkbaar met PerMonitor, maar schakelt dpi-wijzigingsmeldingen voor onderliggende vensters en verbeterd schaalgedrag in.
  • DpiUnaware—De toepassing schaalt niet mee met DPI-wijzigingen en Windows verzorgt de schaling.
  • DpiUnawareGdiScaled— Vergelijkbaar met DpiUnaware maar biedt een betere kwaliteit voor op GDI gebaseerde inhoud.

Zie Wat is er nieuw in Windows Forms voor .NET 6 voor meer informatie over het configureren van DPI-instellingen.

Behoefte aan automatisch schalen

Zonder automatisch schalen wordt een toepassing die is ontworpen voor één weergaveresolutie of lettertype te klein of te groot weergegeven wanneer deze resolutie of lettertype verandert. Als u bijvoorbeeld een toepassing ontwerpt met Tahoma 9 punten als uitgangspunt, ziet deze er zonder aanpassing te klein uit wanneer deze wordt uitgevoerd op een systeem waarop het systeemlettertype Tahoma 12 punten is. Tekstelementen, zoals titels, menu's en de inhoud van het tekstvak, worden kleiner weergegeven dan andere toepassingen. Bovendien is de grootte van gebruikersinterface-elementen die tekst bevatten, zoals de titelbalk, menu's en veel besturingselementen, afhankelijk van het gebruikte lettertype. In dit voorbeeld worden deze elementen ook relatief kleiner weergegeven.

Er treedt een analoge situatie op wanneer u een toepassing ontwerpt voor een bepaalde weergaveresolutie. De meest voorkomende schermresolutie is 96 dots per inch (DPI), wat overeenkomt met een weergaveschaal van 100%, maar schermen met een hogere resolutie die 125%, 150% en 200% ondersteunen (wat respectievelijk overeenkomt met 120, 144 en 192 DPI) en hoger komen steeds vaker voor. Zonder aanpassing lijkt een toepassing, met name een grafische oplossing, die is ontworpen voor één resolutie, te groot of te klein wanneer deze op een andere resolutie wordt uitgevoerd.

Automatisch schalen biedt een oplossing voor deze problemen door het formulier en de onderliggende besturingselementen automatisch van grootte te wijzigen op basis van de relatieve lettergrootte of schermresolutie. Het Windows-besturingssysteem ondersteunt het automatisch schalen van dialoogvensters met behulp van een relatieve maateenheid met de naam dialoogvensters. Een dialoogvenstereenheid is gebaseerd op het systeemlettertype en de relatie met pixels kan worden bepaald via de Win32 SDK-functie GetDialogBaseUnits. Wanneer een gebruiker het thema wijzigt dat door Windows wordt gebruikt, worden alle dialoogvensters automatisch aangepast. Windows Forms ondersteunt automatisch schalen op basis van het standaardlettertype of de weergaveresolutie. Desgewenst kunt u automatisch schalen in een toepassing uitschakelen.

Waarschuwing

Willekeurige combinaties van DPI- en lettertypeschaalmodi worden niet ondersteund. Hoewel u een gebruikersbesturing kunt schalen met één modus (bijvoorbeeld DPI) en die zonder problemen op een formulier kunt plaatsen met een andere modus (Lettertype), kan het combineren van een basisformulier in de ene modus met een afgeleid formulier in een andere modus leiden tot onverwachte resultaten.

Automatisch schalen in actie

Windows Forms gebruikt de volgende logica om formulieren en hun inhoud automatisch te schalen:

  1. Tijdens het ontwerp registreert elk ContainerControl de schaalmodus en de huidige resolutie in respectievelijk de AutoScaleMode en AutoScaleDimensions eigenschappen.

  2. Tijdens runtime wordt de werkelijke resolutie opgeslagen in de eigenschap CurrentAutoScaleDimensions. De eigenschap AutoScaleFactor berekent dynamisch de verhouding tussen de uitvoerings- en ontwerptijdschaalresolutie.

  3. Wanneer het formulier wordt geladen en de waarden van CurrentAutoScaleDimensions en AutoScaleDimensions verschillen, wordt de methode PerformAutoScale aangeroepen om het besturingselement en de onderliggende elementen te schalen. Deze methode onderbreekt de indeling en roept de Scale methode aan om de werkelijke schaalaanpassing uit te voeren. Daarna wordt de waarde van AutoScaleDimensions bijgewerkt om progressieve schaling te voorkomen.

  4. PerformAutoScale wordt ook automatisch aangeroepen in de volgende situaties:

    • Als reactie op de OnFontChanged-gebeurtenis wanneer de schaalmodus Fontis.

    • Wanneer de indeling van het containerbesturingselement wordt hervat en er een wijziging wordt gedetecteerd in de eigenschappen AutoScaleDimensions of AutoScaleMode.

    • Wanneer een bovenliggend ContainerControl item wordt geschaald. Elk containercontrole is verantwoordelijk voor het schalen van zijn kinderen met behulp van zijn eigen schaalfactoren, en niet van de bovenliggende container.

  5. Kinderbesturingselementen kunnen hun schaalgedrag op verschillende manieren wijzigen:

    • Overschrijf de eigenschap ScaleChildren om te bepalen of de onderliggende besturingselementen ervan moeten worden geschaald.

    • Overschrijf de GetScaledBounds methode om de grenzen aan te passen waarnaar het besturingselement is geschaald, maar niet de schaallogica.

    • Overschrijf de ScaleControl methode om de schaallogica voor het huidige besturingselement te wijzigen.

Hoge DPI-verbeteringen

.NET bevat aanzienlijke verbeteringen aan rendering met hoge DPI, met name met de modus PerMonitorV2:

  • DPI-bewustzijn per monitor: toepassingen worden dynamisch aangepast wanneer ze worden verplaatst tussen beeldschermen met verschillende DPI-instellingen.
  • Verbeterd schaalgedrag: besturingselementen worden correct geschaald wanneer DPI wordt gewijzigd, inclusief geneste besturingselementen en containerbesturingselementen (.NET 6+).
  • Schalen van formuliergrootte—de eigenschappen MaximumSize en MinimumSize worden geschaald op basis van de huidige DPI-instellingen van de monitor (.NET 7+, standaard ingeschakeld in .NET 8+).
  • DPI-wijzigingsevenementen: met nieuwe gebeurtenissen kunt u via een programma dynamische DPI-wijzigingen afhandelen:
    • DpiChanged— Wordt geactiveerd wanneer de DPI-instelling wordt gewijzigd op het weergaveapparaat waarop het formulier momenteel wordt weergegeven.
    • DpiChangedBeforeParent— Wordt geactiveerd wanneer de DPI-instelling voor een besturingselement programmatisch wordt gewijzigd voordat een DPI-wijzigings gebeurtenis voor het bovenliggende besturingselement of formulier plaatsvindt.
    • DpiChangedAfterParent— Wordt geactiveerd wanneer de DPI-instelling voor een besturingselement programmatisch wordt gewijzigd nadat een DPI-wijzigings gebeurtenis voor het bovenliggende besturingselement of formulier plaatsvindt.

Zie Wat is er nieuw in Windows Forms voor .NET 6, wat is er nieuw in Windows Forms voor .NET 7 en wat is er nieuw in Windows Forms voor .NET 8 voor meer informatie over verbeteringen in hoge DPI.

verschillen in .NET Framework

.NET Framework en .NET gaan verschillend om met DPI-bewustzijn:

  • Configureer in .NET Framework DPI-bewustzijn via een app.config-bestand met het <System.Windows.Forms.ApplicationConfigurationSection> element.
  • Configureer in .NET DPI-bewustzijn via het projectbestand met de ApplicationHighDpiMode eigenschap.
  • .NET Framework maakt gebruik van manifestbestanden voor DPI-configuratie. Dit wordt niet meer aanbevolen.
  • .NET biedt beter schaalgedrag en betrouwbaardere DPI-wijzigingsafhandeling.

Zie High DPI-ondersteuning in Windows Forms voor meer informatie over .NET Framework DPI-configuratie.

Zie ook