WPFアプリでライトテーマ・ダークテーマに対応するライブラリー

WPFアプリの外観をライトテーマ・ダークテーマで切り替えるにはどうしたらよいかなぁーと思い調べ始めました。

ライトテーマとダークテーマのライブラリー

WPFアプリの外観を変えるには、StyleやTemplateの仕組み(WPF のスタイルとテンプレート / Styles and templates in WPF)を使って変更すればよいとか、WPF Themeの仕組み(テーマ レベルでのリソース定義 / ThemeInfoAttribute クラス)を使て変更すればよいと言われればその通りです。

ただ、個別にStyleやTemplateを用意するのは大変です。また、WPF Themeの仕組みはWindowsのデスクトップテーマに自動追随する仕組みであり、Windows 10のUWPアプリ向けのWindowsユーザー設定であるライトテーマやダークテーマに自動追随できるものではありません。

なるべく、アプリ本体側の改変を少なく、ライトテーマ・ダークテーマの切り替えを容易に実現する方法はないかと、いろいろ探していました。見つからない場合は、自分で作成することも考えていました。

MetroRadianceライブラリー

そして、nugetに公開されているMetroRadianceにたどり着きました。ソースコードもgithubのMetroRadianceに公開されいます。

githubには、ライブラリーのソースコードだけでなく、サンプルアプリのソースコードも公開されています。WPFアプリに適用すると以下のようになります。

MetroRadianceの適用例

なかなかいい感じでライトテーマやダークテーマが実現できています。アクセントカラーもWindowsの設定に連動できます。

このライブラリーでいいのではないかと思い、これを利用することにします。

MetroRadianceの最新版

nugetの情報を参照すると、MetroRadianceの最新版は2.4.0で2017年2月22日にリリースされています。

MetroRadianceのnuget情報(2020年7月19日時点)

最新版のリリースは3年以上前です。更新がないのは、バグがないからなのか、それとも、作者が更新の意欲がなくなったかのどちらなのかが気になります。

ソースコードがgithubに公開されているので、何か情報がないか調べます。issuespull requestsにはいくつか登録されているのが確認できます。

2.4.0のリリースの2017年以降には以下のようなものが登録されています。

Issues

Pull Requests

この内容からは、新しい開発環境やバグに対応していないように見えます。うーん、作者は更新をやめたようです。別のアプリに興味が移ったのでしょう。

MetroRadianceのライセンスを確認するとMITです。ならば更新版を作りましょうと思い立ったわけです。

というわけで、MetroRadianceの更新版を作成します。

MetroRadianceライブラリーの修正版を作成

MetroRadiance.Forkは、MetroRadianceをgithub上でフォークして作成しました。フォークした後、IssuesとPull Requestsの項目のいくつかに対応しました。

Issuesの対応

Issuesに上がっていた「Add dotNET 4.8 Support」に対応しました。

これは、.NET Framework 4.8の問題というよりは、Visual Studio 2017でオプション扱いになったライブラリ(Blend for Visual Studio SDK for .NET)に関する問題です。このライブラリーはVisual Studio 2019では削除されていしまいました。MetroRadianceライブラリーは、このモジュールを参照していたため、最新のVisual Studioのみがインストールされた開発環境下で利用できなくなったようです。参照を別のライブラリーに変更することにより対応しました。

Pull Requestsの対応

Pull Requestsついては、上記に挙げた3つに対応しました。機能拡張が一つとバグ修正が二つです。

nugetでの公開を検討

せっかく修正版を作成したので、nugetに公開を試みます。いままで、自身ではnugetに直接公開したことはなかったので、何もかも初めてです。公開するにあたってライブラリーのIdを決める必要があります。本家と全く同じIdはだめだと思うので、別のIdを考えます。

nugetで公開されているライブラリーを眺めていると、フォークしたライブラリーも公開されているのがわかりました。フォークしたライブラリーには、本家のIdをベースにして、Forkという名前を追加しているものが多いです。それらに合わせて、MetroRadiance.Forkとすることにしました。

MetroRadiance.Forkライブラリー

というわけで、MetroRadiance.Forkライブラリーをnugetに公開しました。バージョンは、本家のバージョンが2.4.0が最終版であるため、2.5.0としました。ソースコードもgithubで公開しています。

このフォーク版MetroRadiance.Forkでは、本家の実装から名前空間・クラス名・メソッド名・アセンブリ名などは変更していません。そのため、今まで本家のMetroRadianceライブラリーを使っていた場合は、ソースコードの修正は必要ありません。ライブラリーを置き換えるのみで使えます。

MetroRadiance.Forkのnuget情報(2020年7月19日時点)

今回の投稿では、nugetに公開したMetroRadiance.Forkの紹介でした。

“WPFアプリでライトテーマ・ダークテーマに対応するライブラリー” への1件の返信

コメントを残す