Appレベルで動的にxamlを読み込むようにしたので、
スキン変更機能を追加します。
public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); //オプションの読込 var option = Option.Instance; //アプリケーションの実行ファイルのフォルダ var baseUri = Directory.GetParent( System.Reflection.Assembly.GetExecutingAssembly().Location).FullName; //選択されたスキン名(=フォルダ名) //まだ機能追加していないのでデフォルト限定 var skinFolderName = "Default"; if (System.IO.Directory.Exists(string.Format(@"{0}\Skins\{1}", baseUri, option.Skin))) { skinFolderName = option.Skin; } //スキンの読込 ResourceDictionary rd = new ResourceDictionary(); foreach (DictionaryEntry entry in this.Resources) {//既存のリソースに追加するため rd[entry.Key] = entry.Value; } rd.MergedDictionaries.Add( Application.LoadComponent(new Uri("/Resources/CommonTemplates.xaml", UriKind.Relative)) as ResourceDictionary); //スキンフォルダの共通スキンを読込(Skinsフォルダ直下は共通) foreach (var file in Directory.GetFiles(string.Format(@"{0}\Skins", baseUri), @"*.xaml")) { var theme = XamlReader.Load(XmlReader.Create(file)) as ResourceDictionary; rd.MergedDictionaries.Add(theme); } //選択されたスキンの読込 foreach (var file in Directory.GetFiles( string.Format(@"{0}\Skins\{1}", baseUri, skinFolderName), @"*.xaml")) { var theme = XamlReader.Load(XmlReader.Create(file)) as ResourceDictionary; rd.MergedDictionaries.Add(theme); } this.Resources = rd;
アプリケーションのスタートアップで、
Skinsフォルダ直下と指定したスキンフォルダのxamlのみを読み込みます。
Optionには当然Skinプロパティを追加しています。
(View、ViewModel、Modelすべてに追加していますが、
すごく簡単なので説明しなくてもわかると思います。)
Skinの増やし方はDefaultフォルダをコピーして、
変更したい部分をちょこちょこと書き換えるだけです。
ただし、しばらくは表示関係は頻繁に修正が入りそうなので、
スキンのカスタマイズの実用はもう少し先になりそうです。
0 件のコメント:
コメントを投稿