Automatisk skalning

Med automatisk skalning kan ett formulär och dess kontroller, utformade på en dator med en viss bildskärmsupplösning eller teckensnitt, visas korrekt på en annan dator med en annan bildskärmsupplösning eller teckensnitt. Formulär och kontroller ändrar storlek intelligent så att de överensstämmer med interna fönster och andra program på både användares och andra utvecklares datorer. Automatisk skalning och visuella format hjälper Windows Forms program att upprätthålla ett konsekvent utseende jämfört med interna Windows program på varje användares dator.

För det mesta fungerar automatisk skalning som förväntat i Windows Forms. Ändringar i teckensnittsschemat kan dock vara problematiska. Ett exempel på hur du löser det här problemet finns i Så här svarar du på ändringar i teckensnittsschema i ett Windows Forms-program.

DPI-medvetenhet i .NET

DPI-medvetenhet konfigureras i projektfilen med egenskapen ApplicationHighDpiMode, som som standard är inställd på SystemAware. Den här konfigurationen fungerar med programmets bootstrap-system för att automatiskt konfigurera DPI-hantering när programmet startar.

Standard- och rekommenderat DPI-läge för Windows Forms-program är SystemAware. Det här läget frågar efter DPI-inställningen en gång vid programstart och använder det värdet under programmets livslängd, vilket ger konsekvent skalningsbeteende.

Konfigurera DPI-läge i projektfilen:

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

Note

Den rekommenderade metoden är att konfigurera DPI via projektfilen, men du kan fortfarande använda en programmanifestfil (app.manifest) för att åsidosätta de här inställningarna. Det rekommenderas dock inte att använda manifestet eftersom det kan orsaka konflikter med programkonfigurationen. Mer information finns i Kompilatorvarning WFO0003.

Visual Studio designeröverväganden

När du utformar formulär i Visual Studio kan du behöva konfigurera designerns DPI-medvetenhet separat från ditt program. Från och med Visual Studio 2022 version 17.8 kan du ange ForceDesignerDPIUnaware egenskapen i projektfilen så att Windows Forms designer körs i DPI-omedvetet läge. Den här inställningen hjälper dig att undvika renderingsproblem när du designar formulär på skärmar med hög DPI:

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

Den här egenskapen påverkar bara Visual Studio designer och ändrar inte hur programmet körs. Mer information finns i Inaktivera DPI-medvetenhet för att åtgärda skalningsproblem.

Tillgängliga DPI-lägen är:

  • SystemAware– Programmet frågar efter DPI en gång vid start och använder det här värdet för appens livslängd.
  • PerMonitor– Programmet söker efter DPI-ändringar per övervakare och skalar om när DPI ändras.
  • PerMonitorV2– Liknar PerMonitor, men aktiverar DPI-ändringsmeddelanden för underordnade fönster och förbättrat skalningsbeteende.
  • DpiUnaware– Programmet skalas inte för DPI-ändringar och Windows hanterar skalningen.
  • DpiUnawareGdiScaled– Liknar DpiUnaware men ger bättre kvalitet för GDI-baserat innehåll.

Mer information om hur du konfigurerar DPI-inställningar finns i Nyheter i Windows Forms för .NET 6.

Behov av automatisk skalning

Utan automatisk skalning visas ett program som är utformat för en visningsupplösning eller ett teckensnitt för litet eller för stort när den upplösningen eller teckensnittet ändras. Om du till exempel utformar ett program med Tahoma 9-punkt som baslinje, visas det utan justering för litet när det körs på en dator där systemteckensnittet är Tahoma 12-punkt. Textelement, till exempel rubriker, menyer och innehåll i textrutor, visas mindre än i andra program. Dessutom beror storleken på användargränssnittselement (UI) som innehåller text, till exempel namnlisten, menyerna och många kontroller, på det teckensnitt som används. I det här exemplet ser dessa element också relativt mindre ut.

En liknande situation uppstår när du utformar ett program för en viss visningsupplösning. Den vanligaste visningsupplösningen är 96 punkter per tum (DPI), vilket motsvarar 100% visningsskalning, men högre upplösning visar stöd för 125%, 150%, 200% (som respektive är lika med 120, 144 och 192 DPI) och högre blir vanligare. Utan justering visas ett program, särskilt ett grafikbaserat, som är utformat för en upplösning antingen för stort eller för litet när det körs med en annan upplösning.

Automatisk skalning åtgärdar dessa problem genom att automatiskt ändra storlek på formuläret och dess underordnade kontroller enligt den relativa teckenstorleken eller visningsupplösningen. Windows-operativsystemet stöder automatisk skalning av dialogrutor med hjälp av en relativ måttenhet som kallas dialogenheter. En dialogruta baseras på systemteckensnittet och dess relation till bildpunkter kan fastställas via funktionen GetDialogBaseUnitsWin32 SDK . När en användare ändrar det tema som används av Windows justeras alla dialogrutor automatiskt. Windows Forms stöder automatisk skalning, antingen enligt standardsystemteckensnittet eller visningsupplösningen. Du kan också inaktivera automatisk skalning i ett program.

Försiktighet

Godtyckliga blandningar av DPI- och teckensnittsskalningslägen stöds inte. Även om du kan skala en användarkontroll med ett läge (till exempel DPI) och placera den i ett formulär med ett annat läge (teckensnitt) utan problem, kan blandning av ett basformulär i ett läge och ett härlett formulär i ett annat leda till oväntade resultat.

Automatisk skalning i praktiken

Windows Forms använder följande logik för att automatiskt skala formulär och deras innehåll:

  1. Vid designtillfället registrerar varje ContainerControl skalningsläget och sin aktuella upplösning i egenskaperna AutoScaleMode respektive AutoScaleDimensions.

  2. Under körning lagras den faktiska upplösningen i egenskapen CurrentAutoScaleDimensions. Egenskapen AutoScaleFactor beräknar dynamiskt förhållandet mellan skaleringsupplösningen vid körtid och designtid.

  3. När formuläret laddas, om värdena för CurrentAutoScaleDimensions och AutoScaleDimensions skiljer sig åt, anropas metoden PerformAutoScale för att skala kontrollen och dess underordnade kontroller. Den här metoden pausar layouten och anropar metoden Scale för att utföra den faktiska skalningen. Därefter uppdateras värdet på AutoScaleDimensions för att undvika progressiv skalning.

  4. PerformAutoScale anropas också automatiskt i följande situationer:

    • Som svar på händelsen OnFontChanged om skalningsläget är Font.

    • När containerkontrollens layout återupptas och en ändring identifieras i egenskaperna AutoScaleDimensions eller AutoScaleMode.

    • När ett överordnat element ContainerControl skalas. Varje kontroll ansvarar för att skala sina barn med hjälp av sina egna skalningsfaktorer och inte den från den överordnade containern.

  5. Barnkontroller kan ändra sitt skalningsbeteende på flera sätt:

    • Åsidosätt ScaleChildren-egenskapen för att avgöra om underordnade kontroller ska skalas.

    • Åsidosätt metoden GetScaledBounds för att justera de gränser inom vilka kontrollen skalas, men inte skalningslogiken.

    • Åsidosätt ScaleControl metoden för att ändra skalningslogik för den aktuella kontrollen.

Höga DPI-förbättringar

.NET innehåller betydande förbättringar av hög DPI-återgivning, särskilt med PerMonitorV2 läge:

  • DPI-medvetenhet per övervakare – Program justeras dynamiskt när de flyttas mellan bildskärmar med olika DPI-inställningar.
  • Förbättrat skalningsbeteende – Kontroller skalas korrekt när DPI ändras, inklusive kapslade kontroller och containerkontroller (.NET 6+).
  • Skalning av formulärstorlekMaximumSize och MinimumSize egenskaper skalas baserat på de aktuella DPI-inställningarna för övervakaren (.NET 7+, aktiverad som standard i .NET 8+).
  • DPI-ändringshändelser – Med nya händelser kan du programmatiskt hantera dynamiska DPI-ändringar:
    • DpiChanged– Utlöses när DPI-inställningen ändras på visningsenheten där formuläret visas för närvarande.
    • DpiChangedBeforeParent– Utlöses när DPI-inställningen för en kontroll ändras programmässigt innan en DPI-ändringshändelse för dess överordnade kontroll eller formulär inträffar.
    • DpiChangedAfterParent– Utlöses när DPI-inställningen för en kontroll ändras programmatiskt efter att en DPI-ändringshändelse för dess överordnade kontroll eller formulär inträffar.

Mer information om höga DPI-förbättringar finns i Nyheter i Windows Forms för .NET 6, Nyheter i Windows Forms för .NET 7 och Nyheter i Windows Forms för .NET 8.

skillnader i .NET Framework

.NET Framework och .NET hantera DPI-medvetenhet på olika sätt:

  • I .NET Framework konfigurerar du DPI-medvetenhet via en app.config fil med elementet<System.Windows.Forms.ApplicationConfigurationSection>.
  • I .NET konfigurerar du DPI-medvetenhet via projektfilen med ApplicationHighDpiMode egenskapen .
  • .NET Framework använder manifestfiler för DPI-konfiguration, vilket inte längre rekommenderas.
  • .NET ger bättre skalningsbeteende och mer tillförlitlig DPI-ändringshantering.

Information om .NET Framework DPI-konfiguration finns i Stöd för hög DPI i Windows Forms.

Se även