質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2650閲覧

WPF(C#)で、ライトモード&ダークモードで使用する各コントロールの色情報はどこで保持しておくべきでしょうか?

hirokin1234

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2022/04/06 12:27

WPF(C#)で、ライトモード&ダークモードで使用する各コントロールの色情報はどこで保持しておくべきでしょうか?知識のある方ご教授いただけると幸いです。

こんにちは、最近WPFを勉強しはじめた者です。
私はコントロールの形状や色にかなりのこだわりを持っていて、
各々のコントロールの色(カラーコード)をライト・ダークモードの2パターン作り、
現在はその情報をアプリで唯一のviewModelクラスに保持している状態です。

全てのコントロールがその色データとバインドされてますので、SetDark()関数を実行すると、viewModelクラスの中のデータが書き代わるようになっており、
これでコントロールの色の切り替えを実装していますが、
この方法だと、全てのWindowで同じviewModelクラスを参照していないといけなくて、
各々のウィンドウでしか扱わないデータの分離ができません。
(そもそも外観のみに影響する色データはここでは扱ってはいけない気もしております...)

また別のやり方として、App.xaml内にそれぞれのコントロールが共有する色情報を
<SolidColorBrush...>で記述するのもありかと思いましたが、
各コントロールに独自のプロパティ( "IsDarkMode" のような) を持たせる必要があり、
トリガー(<Trigger>)でそのプロパティがTrueになったときにコントロールの細かい部分すべてに
<Setter> を呼んで色情報を変更させる必要があり、
私はControlTemplateでカスタムの外観を作っているので、コントロールの中のすべての要素にx:Key (x:Name)を指定しなければならず、これは結構面倒なコードになってしまうため今のところ回避しています。
(本当はこれが正しいやり方なのかもしれません)

さらに別のやり方としてカスタムコントロールクラスの.xamlファイルに色情報を記述すれば、
そもそもviewModelクラスに色情報を参照する必要がなくなるので、
各々のウィンドウでviewModel内のデータの分離が可能ですが、
この場合だと後で色情報を変えたいときには、全てのコントロールのxamlファイルを書き換える必要があり、とても面倒です。
(別のコントロールでカラーコードが重複してダブっているためです)

色の管理も楽にできて、それぞれのウィンドウが各々のViewModelを参照できるやり方はないでしょうか?
ここに提示した文章がわかりにくいかもしれませんので、細かい内容等は無視してしまっても大丈夫ですが、ただ私の悩みはシンプルで、ライトモード・ダークモードの各カラーコードをどこに保持しておくのが適確であり安全なのかを知りたいだけです。

WPFのプログラミングに詳しい経験者の方などおりましたら、知識をいただけると幸いです。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

既存のライブラリがどうしているかざっと見たところ、ResourceDictionaryをいじっているようですね。
そのまま乗っかってしまってもいいでしょうし、自前にこだわるにしろ参考にはなるでしょう(私だったら面倒なので乗ってしまいますが^^;

MahApps.Metro(ControlzEx)

MahApps.Metro - Thememanager
ControlzEx/ThemeManager.md at develop · ControlzEx/ControlzEx

丸ごと入れ替えてるような感じ?
ControlzEx/ThemeManager.cs at develop · ControlzEx/ControlzEx

Material Design In XAML Toolkit

Advanced Theming · MaterialDesignInXAML/MaterialDesignInXamlToolkit Wiki

色をいっこいっこ変えてる?
MaterialDesignInXamlToolkit/ResourceDictionaryExtensions.cs at master · MaterialDesignInXAML/MaterialDesignInXamlToolkit

投稿2022/04/06 13:39

TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hirokin1234

2022/04/07 03:16

他のライブラリなどわざわざ調べていただきありがとうございます! これらのライブラリのように、やはりResoureDictionaryに書くのがおそらく一番いい方法なんだろうなとは思っていました。 その方法で色の切り替えを実装するにはどうすればいいかを自分で調べていたところ、次の方法で実装することができました。 ①まずは共有するResourceDictionary(app.xaml)に、それぞれのコントロールに割り当てるSolidColorBrushを必要な分を定義する。 ② C#側でThemeChangerというクラスを作り、このクラス内でSetLightMode()、SetDarkMode()などの色を変える関数を作り、関数内部でResourceDictionaryにあるSolidColorBrushの要素にアクセスしてカラーコードを書き換えるように作る。 C#側からResourceDictionaryの要素にアクセスする便利な方法がありました↓ ------------------------------------------------------------------------------------------------------------- // 白を指定 Application.Current.Resources["SolidColorBrushの名前を指定"] = Brushes.white; (適当な色を設定) // 自前の関数のカラーコードで指定 Application.Current.Resources["SolidColorBrushの名前を指定"] = CreateSolidColorBrush("#FFFFFF"); ------------------------------------------------------------------------------------------------------------- これにより、それぞれのウィンドウでDataContextを共有する必要がなくなり、スッキリしました! 自分でテーマを切り替える場合、私的にはこの方法が一番管理が楽だと感じました。 わざわざ調べていただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問