猿问

ResourceDictionary 中的 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: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.'

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


慕斯709654
浏览 357回答 3
3回答

慕妹3242003

我建议不要“从后面的代码中获取颜色。您通常需要刷子,但有时需要颜色。以下是我通常如何定义这些:<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/ 也没试过。

动漫人物

您不需要 Styles.xaml.cs 中的任何内容。创建 Styles.xaml 资源字典:<ResourceDictionary>&nbsp; &nbsp; <SolidColorBrush x:Key="AccentColor" Color="#FFFFFF" /></<ResourceDictionary>要在其他 xaml 文件中使用此颜色,您必须在合并的字典标记中声明它及其路径:<Window><Window.Resources><ResourceDictionary x:Uid="ResourceDictionary_1">&nbsp; &nbsp; <ResourceDictionary.MergedDictionaries>&nbsp; &nbsp; &nbsp; &nbsp; <ResourceDictionary Source="Styles.xaml"/>&nbsp; &nbsp; </ResourceDictionary.MergedDictionaries></Window.Resources><TextBlock Background="{StaticResource AccentColor}"/></Window>您可以像我以前应用 TextBlock 背景的方式使用它。您必须在 ResourceDictionary 的 Source 标记中提供 Styles.xaml 的路径。

RISEBY

我用这个。该演示带有样式切换实现。你可以看一下这个例子,看看它是如何工作的,它都是开源的。
随时随地看视频慕课网APP
我要回答