2013年3月22日金曜日

[Silverlight]ResourceDictionary 分離

ResourceDictionary を複数ファイルに分割して、片方のリソースから片方のリソースへの参照があると、XamlParseException が発生して起動出来ない。

-----------------
XamlParseException
Name/Key XXXXXX を持つ Resource が見つかりません [Line: XX Position: XX]

-----------------


Expression Blend Preview For Silverlight 5 だからなのかもしれないが、App.xaml の MergedDictionaries 内で複数のリソースファイルをロードしようとした時に別リソースファイルへの参照があるとダメそう。イメージファイルの定義が1ファイルに纏めたいんだけど。。。

対処としては、App.xaml 内で定義している ResourceDictionary をコードビハインドでロードさせる。


        private void loadResource(Uri uri)
        {
            var info = Application.GetResourceStream(uri);
            string xaml;
            using (var reader = new StreamReader(info.Stream))
            {
                xaml = reader.ReadToEnd();
            }

            ResourceDictionary result = (ResourceDictionary)XamlReader.Load(xaml);
            foreach (DictionaryEntry item in result)
            {
                
                try
                {
                    Application.Current.Resources.Add(item.Key, item.Value);
                }
                catch (Exception ex)
                {
                }
            }
        }




実行時はそれでいんだけど、デザイナで表示出来ないのもなんとかならんか。調べてみると、DesignTimeResources.xaml というものがあり、Blend 起動時に参照が切れているリソースがあると、自動生成してくれる。(Properties ディレクトリ配下出来る)

これでもダメな場合、複数の ResourceDictionary ファイルを1ファイル内でロードするようにしたものをDesignTimeResources.xamlに書くとよい。

それでもダメな場合、一度ビルドして Blend ないし VisualStudio を終了させ、起動させると表示されることがある。

定義の仕方が悪いのかもしれないが、なんともすっきりしないやり方だ〜。

0 件のコメント:

コメントを投稿