Dieses Projekt fügt Unterstützung für Themen in .NET WinForms -Anwendungen hinzu. Dieses Projekt unterstützt sowohl außerhalb der Box- als auch benutzerdefinierte Themen und verwendet unser Projekt mit winforms stilabbarem Kontroll-Projekt zu Stilsteuerungen, denen die Stilunterstützung fehlt.
Installieren Sie zunächst das ReportGenerator -Tool:
dotnet tool install -g dotnet-reportgenerator-globaltool
Erstellen Sie als nächstes eine Debug -Version des Projekts:
dotnet build WinFormsThemes/WinFormsThemes.sln -c Debug
Der Test -Deckungsbericht kann dann mit:
rmdir /s /q WinFormsThemesTestProjectTestResults
dotnet test WinFormsThemes/TestProject --no-build --verbosity normal --collect:"XPlat Code Coverage"
reportgenerator -reports:WinFormsThemesTestProjectTestResults*coverage.cobertura.xml -targetdir:WinFormsThemesTestProjectTestResultshtml -reporttypes:Html -sourcedirs:WinFormsThemesWinFormsThemes
start "" WinFormsThemesTestProjectTestResultshtmlindex.html
Wir verwenden Stryker.net für Mutationstests. Um die Mutationstests durchzuführen, verwenden Sie:
dotnet tool restore
dotnet stryker
WICHTIG: Starten Sie Stryker nicht im Projektverzeichnis - Sie müssen es in der Lösungs -DIR starten, andernfalls wird die Konfiguration nicht gefunden!
Um dieses Projekt zu verwenden, müssen Sie zuerst einen Verweis auf unser Nuget -Paket ( dotnet add package AssortedDevelopment.WinFormsThemes "hinzufügen.
Hinweis: Derzeit erfordert dieses Projekt .NET 6.0 oder höher.
Als nächstes müssen Sie die Themen konfigurieren:
var registry = ThemeRegistryHolder . GetBuilder ( ) . Build ( ) ;
var theme = registry . ThemeRegistry . GetTheme ( ) ; Dies kann beispielsweise in das Program.cs eingefügt werden.
Endlich müssen Sie das Thema für alle Formulare zur Verfügung stellen, um sie zu thematisieren, und eine einzelne Zeile im Load hinzuzufügen:
theme . Apply ( this ) ;Dadurch wird dieses Thema in der angegebenen Form und allen Kindern angewendet.
Natürlich können Sie diese Bibliothek erweitern und das Handling so anpassen, dass Sie Ihren Anforderungen entsprechen. Hier sind einige Beispiele:
Wenn Sie ein Problem mit dieser Bibliothek debuggen möchten, können Sie die Protokollierung im IThemeRegistryBuilder aktivieren:
ThemeRegistryHolder . GetBuilder ( ) . SetLoggerFactory ( LoggerFactory ) . Build ( ) ; Dadurch protokolliert alle Aktionen der Bibliothek an den gegebenen ILoggerFactory .
Hinweis: Alle Anrufe vor dem Aufrufen SetLoggerFactory sind nicht betroffen, daher empfehlen wir, SetLoggerFactory so früh wie möglich aufzurufen.
Wenn Sie keine Abhängigkeitsinjektion in Ihrem Projekt zur Verfügung haben, stellen wir Dienstprogramme zur Verfügung, um sowohl IThemeRegistry als auch ITheme weltweit verfügbar zu machen:
IThemeRegistry Für die IThemeRegistry bieten wir die Klasse der ThemeRegistryHolder an, mit der die Registrierung gespeichert und später abgerufen werden kann: ThemeRegistryHolder . ThemeRegistry = ThemeRegistryHolder . GetBuilder ( ) . Build ( ) ; Danach können Sie die Registrierung von überall in Ihrer Bewerbung mit: var registry = ThemeRegistryHolder.ThemeRegistry;
ITheme Für das ITheme bietet die IThemeRegistry eine Current Eigenschaft, mit der das aktuelle Thema abgerufen werden kann. Damit dies funktioniert, müssen Sie einen Selektor konfigurieren, der das aktuelle Thema definiert: private ITheme SelectCurrentTheme ( IThemeRegistry registry )
{
//logic to select theme here
}
.. .
ThemeRegistryHolder . ThemeRegistry = ThemeRegistryHolder . GetBuilder ( ) . WithCurrentThemeSelector ( SelectCurrentTheme ) . Build ( ) ; Auf diese Weise können Sie IThemeRegistry.Current verwenden, um das aktuelle Thema und IThemeRegistry.OnThemeChanged abzurufen.
var mytheme = ThemeRegistryHolder . ThemeRegistry . Current ;
ThemeRegistryHolder . ThemeRegistry . OnThemeChanged += ( sender , args ) =>
{
//logic to handle theme change here
} ; Standardmäßig wird unsere Bibliothek die Einstellungen des Betriebssystems in Bezug auf den Dunklen Modus und den hohen Kontrast beim Aufrufen GetTheme ehren. Wenn Sie zusätzliche Auswahlkriterien hinzufügen möchten oder dem Benutzer eine Option zur Übergabe dieser Auswahl geben möchten, können Sie dies einfach tun. Anstatt sich auf CurrentThemeSelector Standardeinstellungen IThemeRegistry.Current IThemeRegistry.GetTheme() zu verlassen
IThemeRegistry registry = ThemeRegistryHolder . GetBuilder ( )
. WithCurrentThemeSelector ( registry => registry . GetTheme ( ) )
. Build ( ) ;
var selectedTheme = registry . CurrentTheme ;Aus der Schachtel gibt es 2 Möglichkeiten, benutzerdefinierte Themen hinzuzufügen:
.theme.json , die in einem themes der Arbeitsverzeichnis gespeichert ist.CONFIG_THEMING_THEME_ beginntBeide Möglichkeiten verwenden das gleiche JSON -Format für die Themendefinition (die Version definiert das Format der Datei). Ein einfaches Beispiel dafür könnte sein:
{
"name" : " theme-name " ,
"capabilities" : [ " DarkMode " , " HighContrast " ],
"version" : 3 ,
"variables" : {
"backColor" : " #082a56 " ,
"foreColor" : " #082a57 "
},
"colors" : {
"backColor" : " backColor " ,
"foreColor" : " foreColor " ,
"controls" : {
"backColor" : " backColor " ,
"foreColor" : " foreColor "
}
}
}Die vollständige Liste der verfügbaren Einstellungen finden Sie hier unser JSON -Schema.
Wenn diese beiden Wege nicht flexibel genug sind, können Sie ein Thema selbst implementieren und es mithilfe einer benutzerdefinierten Themenquelle registrieren (siehe unten): Die bevorzugte Möglichkeit besteht darin, AbstractTheme zu unterklassen, da Sie nur die Grundfarben implementieren und optional die erweiterten Farben überschreiben müssen - Styling Die Steuerelemente erfolgen von der Basisklasse.
Der fortgeschrittenere Weg implementiert die ITheme -Schnittstelle. Dies unterstützt nur die grundlegende Infrastruktur wie Themenfunktionen, aber das Styling liegt vollständig in Ihren Händen.
Die Ansichten können hinzugefügt werden, indem entweder ein IThemeLookup (siehe unten) oder ein direktes Hinzufügen zum Bauherrn hinzugefügt wird:
ThemeRegistryHolder . GetBuilder ( )
. WithThemes ( )
. AddDefaultThemes ( )
. AddTheme ( new MySuperDarkTheme ( ) )
. FinishThemeList ( )
. Build ( ) ; Wenn Sie neben Dateien und Ressourcen eine andere Themenquelle hinzufügen möchten (z. B. bei der Implementierung von benutzerdefinierten ITheme oder AbstractTheme -Implementierungen) oder nur den Ordnerpfad ändern möchten, können Sie eine benutzerdefinierte IThemeLookup -Implementierung hinzufügen, die die Suche nach verfügbaren Themen verarbeitet:
internal class MyThemeLookup : IThemeLookup
{
public int Order => 999 ; //highest order wins when 2 lookups return the same theme name
public List < ITheme > Lookup ( )
{
List < ITheme > results = new List < ITheme > ( ) ;
//implement search for themes here
return results ;
}
}
}Danach müssen Sie diese Klasse im Bauherr registrieren:
ThemeRegistryHolder . GetBuilder ( )
. WithThemes ( )
. AddDefaultThemes ( )
. WithLookup ( )
. FinishThemeList ( )
. Build ( ) ;Da wir Sie nicht dazu zwingen möchten, eine bestimmte WinForms Control Library zu verwenden, unterstützen wir derzeit nur das Styling von Standard-Steuerelementen und -steuerungen aus unserem Projekt von WinForms-stylierbaren Kontrollen. Wie wir verstehen, möchten Sie vielleicht auch andere Steuerelemente stylen. Wir unterstützen das Hinzufügen von speziellen Plugins, um das Styling einer bestimmten Art von Steuerung zu bewältigen. Dazu müssen Sie ``:
internal class MyCustomControlThemePlugin : AbstractThemePlugin < MyCustomControl >
{
protected override void ApplyPlugin ( MyCustomControl mcc , AbstractTheme theme )
{
//style control based on the colors available in the Theme
}
}Endlich müssen Sie es nur für den richtigen Typ registrieren:
ThemeRegistryHolder . GetBuilder ( )
. AddThemePlugin ( new MyCustomControlThemePlugin ( ) )
. Build ( ) ;Hinweis: Derzeit unterstützen wir nur direkt registrierte Typen. Unterklassen werden nicht automatisch gestaltet!
Bitte sehen Sie den Beitrag zur beitragenden Anleitung für weitere Informationen.