1

要するに私の質問は: WP7.1 アプリで ResourceDictionaries を切り替える方法は? 私がやろうとしている方法よりも簡単な方法はありますか?

詳細...

Windows Phone 7 プロジェクトでは、ユーザーのテーマ (ライト/ダーク) に従ってアプリケーション リソースを置き換える必要があります。
    a) ResourceDictionary 変数を作成する
    b) 現在のテーマに従って適切なスタイルとブラシのリソース ファイルを取得するc
    ) 上記のリソースを Application.Current.Resources.MergedDictionaries に追加する

これが私がやっていることです:

1) 「View」プロジェクトのリソースのフォルダー構造:
    Resources
        Dark
            Brushes.xaml
            Styles.xaml
        Light
            Brushes.xaml
            Styles.xaml

2) 2 つの Brushes.xaml ファイルのスタイルには同じキーがあります。Styles.xaml と同じです。

3) 私の最初の試み (明るいテーマが選択されていると仮定) で、2 行目に「不明なエラー」が表示されます。

var uriPath = "Resources/Light/Brushes.xaml"; 
var brushes = new ResourceDictionary {Source = new Uri(uriPath, UriKind.Relative)};
dic.MergedDictionaries.Add(brushes);

(参考までに、リソース、ページ、およびコンテンツのビルドアクションで試しました)

4) 2 回目の試みでは、Brushes.xaml をアプリの MergedDictionaries にうまく詰め込むことができたので、希望が持てます。

string xaml;
var uriPath = "Resources/Light/Brushes.xaml";
var brushesUri = new Uri(uriPath, UriKind.Relative);
var brushesStream = Application.GetResourceStream(brushesUri);
using (var brushesStreamReader = new StreamReader(brushesStream.Stream))
    xaml = brushesStreamReader.ReadToEnd();
var dic = new ResourceDictionary();
dic.MergedDictionaries.Add((ResourceDictionary)XamlReader.Load(xaml));

5) brushesStreamReader がnull上記のコードに含まれないようにするには、xaml ファイルを「コンテンツ」に設定する必要があります。(どうして?)

6) ステップ 4 のコードの 2 番目の問題は、Styles.xaml で同じことをしようとしたときです。最後の行に" Failed to assign to property 'System.Windows.ResourceDictionary.Source'" が表示されます (dic.MergedDictionaries.Add...)。おそらくこれは、Styles.xaml が独自の MergedDictionaries に Brushes.xaml を追加するためです。

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml"/>
</ResourceDictionary.MergedDictionaries>

それは...ですか?
ありがとう!

4

2 に答える 2

0

その場合、テーマ ブラシを取得して分析することができます。元:

private Color lightThemeBackground = Color.FromArgb(255, 255, 255, 255); 
private Color darkThemeBackground = Color.FromArgb(255, 0, 0, 0);  


public bool IsLightTheme()
{
     SolidColorBrush backgroundBrush = Application.Current.Resources["PhoneBackgroundBrush"] as SolidColorBrush;   
     if (backgroundBrush.Color == lightThemeBackground) { 
          // you are in the light theme
          return true;
     } 
     else { 
          // you are in the dark theme
          return false;
     }
}
于 2013-01-18T16:10:41.623 に答える
-1

これを行う必要はありません。システム ブラシを使用して、すべてのテーマ カラーを取得します。これらのブラシの概要は次のとおりです。 http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff769552.aspx#BKMK_BrushResources

于 2012-11-30T05:41:53.343 に答える