C# ResourceDictionary中的WPF绑定颜色

C# ResourceDictionary中的WPF绑定颜色,c#,wpf,C#,Wpf,我正在学习WPF,在我的应用程序中,我想使用由用户定义的重音颜色。我所有的样式都是在Style.xaml中定义的,它是一个ResourceDictionary。我想要实现的是: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns

我正在学习WPF,在我的应用程序中,我想使用由用户定义的重音颜色。我所有的样式都是在
Style.xaml
中定义的,它是一个
ResourceDictionary
。我想要实现的是:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Namespace"
    x:Class="Namespace.Style"
    x:ClassModifier="public">

    <Color x:Key="AccentColor" 
        A="{Binding Accent.A}"
        R="{Binding Accent.R}"
        G="{Binding Accent.G}"
        B="{Binding Accent.B}" />
    <SolidColorBrush x:Key="AccentBrush" Color="{Binding AccentColor}"/>
</ResourceDictionary>
上面的代码给出了错误:

'A 'Binding' cannot be set on the 'A' property of type 'Color'. 
 A 'Binding' can only be set on a DependencyProperty of a DependencyObject.'

还有什么其他方法(最好不是太复杂,但也很灵活)来实现此功能,让用户为应用程序的主题定义自己的强调色?

您不需要Styles.xaml.cs中的任何内容。创建Styles.xaml ResourceDictionary:

<ResourceDictionary>
    <SolidColorBrush x:Key="AccentColor" Color="#FFFFFF" />
</<ResourceDictionary>

我用。该演示附带了一个样式切换实现。你可以看看这个例子,看看它是如何工作的,它都是开源的。

我建议不要“从代码背后获得颜色”

通常你需要一把刷子,但有时需要一种颜色。 以下是我通常如何定义这些:

<Color x:Key="PaleBlue">#44A7F7</Color>
<Color x:Key="PaleRed">#F75B71</Color>
<SolidColorBrush x:Key="PaleBlueBrush" Color="{StaticResource PaleBlue}"/>
<SolidColorBrush x:Key="PaleRedBrush" Color="{StaticResource PaleRed}"/>
#44A7F7
#F75B71
这些都放在一个resourcedictionary中,并合并到app.xaml中,这样它们就有了整个应用程序的范围

如果我想改变一个主题,我会为(比如)黑暗主题定义另一个资源字典,为蓝色主题定义另一个资源字典……以此类推

要更改主题,我将相应的资源字典合并到application.current.resources中,然后它们将替换原始资源。 如果希望立即更改,则需要使用DynamicSource来引用这些内容,但主题更改通常是不寻常的事情,“只是”完全重新加载窗口是可以接受的

如果您真的愿意,可以替换代码中的其中一个

Application.Current.Resources[“PaleRedBrush”]=//一些新的solidcolorbrush

resourcedictionary中的很多内容都是冻结的(有一个Freeze()方法),您无法更改它们。 我从来没有试图实现你在那里做的事情,但我认为这可能有问题

您也可以使用实现inotifypropertychanged的桥接静态依赖项对象或类。一个候选对象将涉及静态中的ObservateDictionary as属性。这将允许您以字符串作为名称绑定到笔刷。
也没有试过。

问题是我不希望颜色像
那样硬编码“
。我应该从代码隐藏处得到。那很酷,真的。我要用这个图书馆。但现在我正试图了解WPF的基本知识,我想知道如何使用纯WPF来实现这一点。正如我所说,我不想要太复杂的解决方案。如果这在WPF中不可能实现,好吧,我将使用不同的颜色制作几十种预设样式。我只想让它同时变得简单和灵活。请看Raviraj Palvankar的答案。否则,如果不想使用字典定义样式,可以使用绑定。代码的问题是您没有datacontext。您试图绑定的“口音”是什么?Wpf不知道。您遇到的错误解释如下:颜色是可绑定的属性,但Color.r/g/b不是。@dovaogedot这可能有助于样式设置:学习后,您可以学习如何使用字典和合并字典使“活动样式”可切换。
<Window>
<Window.Resources>
<ResourceDictionary x:Uid="ResourceDictionary_1">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Styles.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</Window.Resources>
<TextBlock Background="{StaticResource AccentColor}"/>
</Window>
<Color x:Key="PaleBlue">#44A7F7</Color>
<Color x:Key="PaleRed">#F75B71</Color>
<SolidColorBrush x:Key="PaleBlueBrush" Color="{StaticResource PaleBlue}"/>
<SolidColorBrush x:Key="PaleRedBrush" Color="{StaticResource PaleRed}"/>