このプロジェクトは、.NET WinFormsアプリケーションのテーマのサポートを追加します。このプロジェクトは、すぐに使用できるテーマとカスタムテーマの両方をサポートし、Winforms-Stylable-Controls Projectを使用して、スタイルのサポートを欠いているスタイルコントロールを使用します。
まず、ReportGeneratorツールをインストールします。
dotnet tool install -g dotnet-reportgenerator-globaltool
次に、プロジェクトのデバッグバージョンを作成します。
dotnet build WinFormsThemes/WinFormsThemes.sln -c Debug
次のテストカバレッジレポートは、以下を使用して作成できます。
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
突然変異試験にはstryker.netを使用します。突然変異テストを実行するには、使用してください。
dotnet tool restore
dotnet stryker
重要:プロジェクトディレクトリでStrykerを起動しないでください - ソリューションdirで起動する必要があります。そうしないと、構成が見つかりません!
このプロジェクトを使用するには、最初にNugetパッケージ( dotnet add package AssortedDevelopment.WinFormsThemes )への参照を追加する必要があります。
注:現在、このプロジェクトには.NET 6.0以降が必要です。
次に、テーマを構成する必要があります。
var registry = ThemeRegistryHolder . GetBuilder ( ) . Build ( ) ;
var theme = registry . ThemeRegistry . GetTheme ( ) ;これは、たとえば、アプリケーションのProgram.csに配置し、デフォルト設定を使用してテーマを検索し、レジストリを返し、標準テーマを使用します。
最後に、テーマにするためにあらゆるフォームにテーマを提供し、 Loadイベントに単一の行を追加する必要があります。
theme . Apply ( this ) ;これにより、このテーマは与えられたフォームとすべての子供に適用されます。
もちろん、このライブラリを拡張して、ニーズに合わせて処理をカスタマイズできます。ここにいくつかの例があります:
このライブラリで問題をデバッグしたい場合は、 IThemeRegistryBuilderでログインすることを有効にできます。
ThemeRegistryHolder . GetBuilder ( ) . SetLoggerFactory ( LoggerFactory ) . Build ( ) ;これにより、ライブラリのすべてのアクションを指定されたILoggerFactoryにログに記録します。
注: SetLoggerFactory呼び出す前の電話は影響を受けませんので、できるだけ早くSetLoggerFactory電話することをお勧めします。
プロジェクトで依存関係の注入がない場合、 IThemeRegistryとITheme両方をグローバルに利用できるユーティリティを提供します。
IThemeRegistry for the IThemeRegistryでは、レジストリを保存して取得するために使用できるThemeRegistryHolderクラスを提供します。 ThemeRegistryHolder . ThemeRegistry = ThemeRegistryHolder . GetBuilder ( ) . Build ( ) ;この後、以下を使用して、アプリケーションのどこからでもレジストリを取得できます。varregistry var registry = ThemeRegistryHolder.ThemeRegistry;
ITheme for ITheme 、 IThemeRegistry 、現在のテーマを取得するために使用できるCurrentプロパティを提供します。ただし、これが機能するには、現在のテーマを定義するセレクターを構成する必要があります。 private ITheme SelectCurrentTheme ( IThemeRegistry registry )
{
//logic to select theme here
}
.. .
ThemeRegistryHolder . ThemeRegistry = ThemeRegistryHolder . GetBuilder ( ) . WithCurrentThemeSelector ( SelectCurrentTheme ) . Build ( ) ;これにより、 IThemeRegistry.Currentを使用して、現在のテーマとIThemeRegistry.OnThemeChangedを取得することができます。
var mytheme = ThemeRegistryHolder . ThemeRegistry . Current ;
ThemeRegistryHolder . ThemeRegistry . OnThemeChanged += ( sender , args ) =>
{
//logic to handle theme change here
} ;デフォルトでは、私たちのライブラリは、 GetTheme呼び出す際のダークモードと高いコントラストに関するオペレーティングシステムの設定を尊重します。追加の選択基準を追加する場合、またはユーザーにこの選択をオーバーライドするオプションを提供する場合は、簡単に実行できます。 IThemeRegistry.GetTheme()でデフォルト設定に依存する代わりに、 CurrentThemeSelectorを提供することにより、必要なテーマにIThemeRegistry.Current設定できます。
IThemeRegistry registry = ThemeRegistryHolder . GetBuilder ( )
. WithCurrentThemeSelector ( registry => registry . GetTheme ( ) )
. Build ( ) ;
var selectedTheme = registry . CurrentTheme ;箱から出して、カスタムテーマを追加するには2つの方法があります。
.theme.jsonは、作業監督のthemesディレクトリに保存されています。CONFIG_THEMING_THEME_で始まるアセンブリのアセンブリリソース両方の方法で、テーマ定義に同じJSON形式を使用します(バージョンはファイルの形式を定義します)。これの簡単な例は次のとおりです。
{
"name" : " theme-name " ,
"capabilities" : [ " DarkMode " , " HighContrast " ],
"version" : 3 ,
"variables" : {
"backColor" : " #082a56 " ,
"foreColor" : " #082a57 "
},
"colors" : {
"backColor" : " backColor " ,
"foreColor" : " foreColor " ,
"controls" : {
"backColor" : " backColor " ,
"foreColor" : " foreColor "
}
}
}利用可能な設定の完全なリストについては、こちらのJSONスキーマを確認してください。
これらの2つの方法が十分に柔軟でない場合は、テーマを自分で実装してカスタムテーマソースを使用して登録できます(以下を参照):ベース色を実装する必要があるため、拡張色をオプションで上書きするだけで、抽象的なAbstractThemeサブクラス化することができます。
より高度な方法は、 IThemeインターフェイスの実装です。これは、テーマ機能のような基本的なインフラストラクチャをサポートするだけですが、スタイリングは完全に手にあります。
ビューは、 IThemeLookupを実装するか(以下を参照)、またはビルダーに直接追加することで追加できます。
ThemeRegistryHolder . GetBuilder ( )
. WithThemes ( )
. AddDefaultThemes ( )
. AddTheme ( new MySuperDarkTheme ( ) )
. FinishThemeList ( )
. Build ( ) ;ファイルとリソース以外のテーマソースを追加する場合(たとえば、カスタムIThemeまたはAbstractTheme実装を実装する場合)、またはフォルダーパスを変更するだけで、利用可能なテーマの検索を処理するカスタムIThemeLookup実装を追加できます。
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 ;
}
}
}この後、このクラスをビルダーに登録する必要があります。
ThemeRegistryHolder . GetBuilder ( )
. WithThemes ( )
. AddDefaultThemes ( )
. WithLookup ( )
. FinishThemeList ( )
. Build ( ) ;特定のWinforms Control Libraryの使用を強制したくないため、現在、WinForms-Stylolsプロジェクトの標準コントロールとコントロールのスタイリングのみをサポートしています。他のコントロールをスタイリングしたい場合があると理解しているように、特定のタイプのコントロールのスタイリングを処理するための特殊なプラグインの追加をサポートします。これを行うには、「」を実装する必要があります。
internal class MyCustomControlThemePlugin : AbstractThemePlugin < MyCustomControl >
{
protected override void ApplyPlugin ( MyCustomControl mcc , AbstractTheme theme )
{
//style control based on the colors available in the Theme
}
}ついに、正しいタイプに登録する必要があります。
ThemeRegistryHolder . GetBuilder ( )
. AddThemePlugin ( new MyCustomControlThemePlugin ( ) )
. Build ( ) ;注:現在、登録されたタイプのみをサポートしています。サブクラスは自動的にスタイリングされません!
詳細については、寄稿ガイドをご覧ください。