C# ResourceDictionary中的WPF绑定颜色
我正在学习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
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}"/>