2

スキン/テーマを使用するアプリを作成しようとしています(使用する色の異なるパレットから選択できます)。

SolidColorBrushプロパティを定義します

public class ThemeManager
{
    public SolidColorBrush ForeBrush { get; set; }       

    public ThemeManager()
    {
        ForeBrush = new SolidColorBrush(Colors.Black);         
    }

    public void SetTheme()
    {        
        ForeBrush.Color = Colors.Red;
    }
}

XAMLでバインドします

<TextBlock Foreground="{Binding ForeBrush,Source={StaticResource Theme}}" />

App.xamlでテーマリソースを宣言します

<local:ThemeManager x:Key="Theme" />

問題は、次のようなスタイルを作成するときです。

<Style x:Key="TextBlockStyle1" TargetType="TextBlock">
     <Setter Property="Foreground" Value="{Binding ForeBrush,Source={StaticResource Theme}}" />
</Style>

これは、に配置するとPage.Resources機能しますが、リソースディクショナリに配置すると(そしてApp.xamlに追加すると)、アプリがクラッシュします(App.gicsのDebugger.Break())。これは、セッターを使用している場合にのみ発生するようです。

私はここで何が間違っているのですか?

編集:リソースディクショナリファイルにスタイルを配置し、app.xamlでそれを参照します

4

1 に答える 1

3

このコードを使用すると、私のPCで動作します(.NET 4.0を使用)

これが辞書です

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:Resources4">
<local:ThemeManager x:Key="Theme"></local:ThemeManager>
<Style TargetType="TextBlock">
    <Setter Property="Foreground" Value="{Binding ForeBrush,Source={StaticResource  Theme}}" />
</Style>
</ResourceDictionary>

これがXAMLのリファレンスです

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml"></ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

あなたが書くなら

<Application.Resources>
    <ResourceDictionary>
        <local:ThemeManager x:Key="Theme" />
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

次に、マージされたリソースディクショナリがどのように機能するかが原因でエラーが発生します。MSDNによると

マージされたディクショナリ内のリソースは、それらがマージされたメインリソースディクショナリのスコープの直後にあるリソースルックアップスコープ内の場所を占めます。

これは、Dictionary1.xamlでは、App.XAMLで定義されたリソースを表示できないことを意味します

于 2012-04-26T13:04:37.993 に答える