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アプリに適用すると以下のようになります。
なかなかいい感じでライトテーマやダークテーマが実現できています。アクセントカラーもWindowsの設定に連動できます。
このライブラリーでいいのではないかと思い、これを利用することにします。
MetroRadianceの最新版
nugetの情報を参照すると、MetroRadiance
の最新版は2.4.0で2017年2月22日にリリースされています。
最新版のリリースは3年以上前です。更新がないのは、バグがないからなのか、それとも、作者が更新の意欲がなくなったかのどちらなのかが気になります。
ソースコードがgithubに公開されているので、何か情報がないか調べます。issuesやpull requestsにはいくつか登録されているのが確認できます。
2.4.0のリリースの2017年以降には以下のようなものが登録されています。
Issues
Pull Requests
- SystemUsesLightTheme に対応した設定を取得するプロパティを追加
- Fix ChromeWindow displays on all virtual desktops when attached to ExternalWindow
- 最小化状態で終了すると、起動時に表示がおかしくなる不具合を修正
この内容からは、新しい開発環境やバグに対応していないように見えます。うーん、作者は更新をやめたようです。別のアプリに興味が移ったのでしょう。
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
ライブラリーを使っていた場合は、ソースコードの修正は必要ありません。ライブラリーを置き換えるのみで使えます。
今回の投稿では、nugetに公開したMetroRadiance.Fork
の紹介でした。
“WPFアプリでライトテーマ・ダークテーマに対応するライブラリー” への1件の返信