DynamicResource に対する WPF のサポートは優れています。これにより、ユーザーは実行中のアプリケーションの外観を変更できるからです。
ただし、WinRT は DynamicResource をサポートしていません。
ユーザーが UI テーマを動的に変更できるようにするアプリを作成するには、どのような方法が推奨されますか?
DynamicResource に対する WPF のサポートは優れています。これにより、ユーザーは実行中のアプリケーションの外観を変更できるからです。
ただし、WinRT は DynamicResource をサポートしていません。
ユーザーが UI テーマを動的に変更できるようにするアプリを作成するには、どのような方法が推奨されますか?
私は現在、これについても良いデザインを考え出そうとしています。DynamicResourcesの欠如を発見する前に、私はかなり「すぐに使える」ものを持っていました。おっと。
私が思いついた最善のアプローチは、設定VMへの変更をリッスンし、UI要素がバインドできるリソースを公開するThemedViewModelベースを用意することです。
public class ThemedViewModel : ViewModelBase
{
public Brush Foreground { get { return ViewModelSelector.Settings.Theme.Foreground; } }
public ThemedViewModel()
{
ViewModelSelector.Settings.PropertyChanged += (sender,arg) =>
{
if(arg.PropertyName == "Theme")
{
RaisePropertyChanged("Foreground");
}
}
}
}
次に、これからテーマベースのVMを派生させ、テーマ化されたUI要素を公開されたリソースにバインドします。それはかなり乾燥していますが、私の心の中でVMのポイントを本当に壊します。VMにはUIリソースが含まれていてはなりません。VMでどのように見えるかを知ることは、私にはうまくいきません。しかし、テーマがコードの表示セクションに制限されているすべてのアプローチは、バインド時に問題が発生するようです。
MVVMパターンを使用する場合、ビューとビューモデルを組み合わせる方法によっては、基になるデータを再作成せずに、切り替えられたテーマに基づいてビューを再作成するのはかなり簡単です。
複数のテーマリソースディクショナリを用意し、それらのどれをアプリケーションリソースディクショナリとマージするかを切り替えてから、ビューを再作成するだけです。