3

設定によって Windows Phone 7 のアプリケーション スタイルを切り替える方法を開発しようとしています。スタイルは次のようになります。

  • コア スタイルは WP7Style_Dark.xaml と WP7Style_Light.xaml で分離され、定義されています。
  • 残りのスタイルは Styles.xaml で宣言されています。

次のコードを使用して、App.xaml.cs のテーマを接続します。

var dictionaries = Resources.MergedDictionaries;
dictionaries.Clear();
string source = String.Format("/CommonUI;component/Resources/{0}.xaml", value == AppStyleSet.Light ? "WP7Style_Light" : "WP7Style_Dark");
//base styles
var themeStyles = new ResourceDictionary {Source = new Uri(source, UriKind.Relative)};
dictionaries.Add(themeStyles);
var generalStyles = new ResourceDictionary();
generalStyles.Source = new Uri("/CommonUI;component/Resources/Styles.xaml",UriKind.Relative);
dictionaries.Add(generalStyles);

実行時に generalStyles.Source を設定すると、例外がスローされます (これは、「未指定エラー」を示す System.Exception です)。Styles.xaml を空にすると例外がなくなることがわかりましたが、もちろんこれは解決策ではありません。

私は何をすべきか?

更新 2:スタック トレースをねじ込みます。ここで問題を絞り込みます。

テーマ スタイルは、テーマの色を定義します。一般的なスタイルは、このようなバインディングに出会うまで正常にロードされ続けます

... <Setter Property="Color" Value="{StaticResource HighlightColor}" />

そのため、StaticResource は解決できず、例外がスローされます。これは何とか回避できないでしょうか?

4

2 に答える 2

2

このアプローチで私が見つけた問題は、リソース ディクショナリがSourceプロパティ内の URL から自身をロードする方法に非同期性があるように見えることです。したがって、ある辞書が以前の辞書の{StaticResource key}where is を使用すると、失敗する可能性があります。key

Application.GetResourceStream解決策の 1 つは、 and を使用して Xaml を抽出することStreamReaderです。次に、XamlReaderを構築するために使用しResourceDictionaryます。そうすれば、依存辞書が必要な静的リソースを確実に見つけることができます。

Application.Resources追加の依存辞書をロードする前に、ツリーの一部になるように各辞書を追加したことを確認する必要があることに注意してください。

于 2010-11-09T13:55:23.163 に答える
1

WP7 は Silverlight 3+ に基づいており、既定では、コードで新しいリソース ディクショナリを作成することはできませんSystem.Exception。そのため、"UnspecifiedError" というメッセージが表示されます。

回避策として、Silverlight3 を使用しているかのように ResourceDictionary を簡単に作成します。このチュートリアルに従ってください

これで問題が解決することを願っています。

于 2010-11-09T13:37:18.140 に答える