绑定资源字典中样式的Setter值

时间:2012-04-26 11:24:52

标签: wpf xaml binding microsoft-metro resourcedictionary

我正在尝试创建一个使用皮肤/主题的应用程序(使用者可以选择不同颜色的托盘)。

我定义了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

中声明了Theme资源
<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.g.i.cs中的Debugger.Break())。 这似乎只在使用Setter时发生。

我在这里做错了什么?

编辑: 将样式放在资源字典文件中并在app.xaml中引用该文件

1 个答案:

答案 0 :(得分:1)

使用此代码可在我的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>

然后,由于合并资源字典的工作原理,您会收到错误。 根据{{​​3}}

  

合并字典中的资源占用资源查找范围中的位置,该位置就在它们合并到主资源字典的范围之后

这意味着在Dictionary1.xaml中无法看到App.XAML中定义的资源