为了账号安全,请及时绑定邮箱和手机立即绑定

ResourceDictionary 中的 WPF 绑定颜色

ResourceDictionary 中的 WPF 绑定颜色

C#
慕斯709654 2022-06-12 11:12:46
我正在学习 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>并在Style.xaml.cs:namespace Namespace{    public partial class Style : ResourceDictionary    {        // this color can be changed later        public Color Accent { get; set; }        public Style()        {            Accent = Color.FromRgb(0x13, 0xaf, 0xf0);            InitializeComponent();        }    }}上面的代码给出了错误:'A 'Binding' cannot be set on the 'A' property of type 'Color'.  A 'Binding' can only be set on a DependencyProperty of a DependencyObject.'还有哪些其他方法(最好不太复杂,但也很灵活)来实现此功能,让用户为应用程序的主题定义自己的强调色?
查看完整描述

3 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

我建议不要“从后面的代码中获取颜色。


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


<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}"/>

这些进入一个资源字典,该字典合并在 app.xaml 中,因此它们具有整个应用程序的范围。


如果我想改变一个主题,我为(比如说)黑暗主题定义另一个资源字典,为蓝色主题定义另一个资源字典......等等。


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


如果你真的想的话,你可以在代码中替换其中的一个。


Application.Current.Resources["PaleRedBrush"] = // 一些新的solidcolorbrush。


资源字典中的很多东西都被冻结了(有一个 Freeze() 方法),您无法更改它们。我从未尝试过确切地实施您在那里所做的事情,但我认为这可能是有问题的。


您也可以使用实现 inotifypropertychanged 的桥接静态依赖对象或类。一位候选人将涉及可观察字典作为静态属性。这将允许您通过字符串作为名称绑定到画笔。http://drwpf.com/blog/2007/09/16/can-i-bind-my-itemscontrol-to-a-dictionary/ 也没试过。


查看完整回答
反对 回复 2022-06-12
?
动漫人物

TA贡献1815条经验 获得超10个赞

您不需要 Styles.xaml.cs 中的任何内容。创建 Styles.xaml 资源字典:


<ResourceDictionary>

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

</<ResourceDictionary>

要在其他 xaml 文件中使用此颜色,您必须在合并的字典标记中声明它及其路径:


<Window>

<Window.Resources>

<ResourceDictionary x:Uid="ResourceDictionary_1">

    <ResourceDictionary.MergedDictionaries>

        <ResourceDictionary Source="Styles.xaml"/>

    </ResourceDictionary.MergedDictionaries>

</Window.Resources>

<TextBlock Background="{StaticResource AccentColor}"/>

</Window>

您可以像我以前应用 TextBlock 背景的方式使用它。您必须在 ResourceDictionary 的 Source 标记中提供 Styles.xaml 的路径。


查看完整回答
反对 回复 2022-06-12
?
RISEBY

TA贡献1856条经验 获得超5个赞

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



查看完整回答
反对 回复 2022-06-12
  • 3 回答
  • 0 关注
  • 356 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信