【问题标题】:Binding Setter value in a style in a resource dictionary在资源字典中的样式中绑定 Setter 值
【发布时间】:2012-05-07 03:02:25
【问题描述】:

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

我定义了一个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 中引用它

【问题讨论】:

  • 此代码适用于我的带有 .Net 4.0 的 PC。您使用的是哪个版本的 .NET?
  • @Klaus78 我已经在 .Net 5(地铁风格的应用程序)和 wpf .Net 4.0 中测试了代码。您是否在字典中添加样式并在 app.xaml 中引用它?

标签: wpf xaml binding microsoft-metro resourcedictionary


【解决方案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>

然后,由于合并资源字典的工作方式,您会收到错误消息。 根据MSDN

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

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

【讨论】:

  • 嗯,是的,这行得通,我只需要让班级成为单身人士。但我仍然很好奇为什么 不起作用
  • 太棒了!将主题管理器添加到单独的资源字典中,然后将其合并到 app.xaml 中即可解决所有问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多