2010年4月19日月曜日

第33回 スキン選択

前回の追記程度ですが。
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 件のコメント:

コメントを投稿