XAML - UWP Windows 10 中的免费强调色

Complimentary accent color in XAML - UWP Windows 10

我正在尝试让一个按钮在执行操作后更改颜色。我的按钮背景设置为 SystemControlBackgroundAccentBrush,我基本上想在单击后获得 'opposite/complementary' 颜色。

我找到了这篇文章:

Using a complimentary accent color

这似乎正是我要找的。我不得不稍微修改一下代码,因为它似乎特定于 windows phone 而不是 UWP。下面是我更改的 class,但请注意,我没有包含上面文章中的全部代码,因为它保持不变:

public class AccentComplimentBrush : ViewModelBase
{
    /// <summary>
    /// The resource name - as it can be referenced by within the app
    /// </summary>
    private const string ResourceName = "AccentComplimentBrush";

    /// <summary>
    /// Initializes a new instance of the <see 
        cref="AccentComplimentBrush"/> class.
    /// </summary>
    public AccentComplimentBrush()
    {
        try
        {
            //// This doesn't work in the designer - so don't even try
            if (this.IsInDesignMode)
            {
                return;
            }

            // Make sure we don't try and add the resource more than once - would 
            //happen if referenced on multiple pages or in app and page(s)
            if (!Application.Current.Resources.ContainsKey(ResourceName))
            {
                var currentAccentColorHex = (SolidColorBrush)Application.Current.Resources["SystemControlBackgroundAccentBrush"];

                var hsl = HslColor.FromColor(currentAccentColorHex.Color);
                hsl.ConvertToCompliment();

                Color compliment = hsl.ToColor();

                Application.Current.Resources.Add(ResourceName, new SolidColorBrush(compliment));
            }
        }
        catch (Exception exc)
        {
            System.Diagnostics.Debug.WriteLine("Something went wrong - ask for your money back");
            System.Diagnostics.Debug.WriteLine(exc);
        }
    }
}

这是从 XAML 调用的方式:

  1. 首先 class 被初始化(并且初始化正常)

    <UserControl.Resources>
        <common:AccentComplimentBrush x:Key="AccentComplimentBrush" />
    </UserControl.Resources>
    
  2. 当它通过上面class的代码时,找到相关资源,获取相关颜色,获取补色并将其转换回资源并添加它到应用程序的资源。如前所述,我已经检查了所有这些并且一切正常。

请注意,它是一个圆形按钮,其中包含一个椭圆,这是我尝试将描边和填充属性分配给新画笔的位置:

<Ellipse Stroke="{StaticResource AccentComplimentBrush}"
         Fill="{StaticResource AccentComplimentBrush}"
         StrokeThickness="2">
</Ellipse>

这是我得到的错误:

The text associated with this error code could not be found. Failed to assign to property 'Windows.UI.Xaml.Shapes.Shape.Fill'. [Line: 301 Position: 46]

从错误看来,分配由 class 生成的 'brush' 时出现问题。

请注意,如果我对 ThemeResource 或实际颜色进行硬编码,Ellipse 代码就可以正常工作。

有什么办法可以解决这个问题吗?有没有更简单的解决方案?

谢谢。

解决方案只是将 Key 修改为 AccentComplimentBrush 以外的任何内容。

<common:AccentComplimentBrush x:Key="whatever" />

是的,里面AccentComplimentBrushclass的构造函数,补色(一个SolidColorBrush)首先使用键 AccentComplimentBrush.

添加到资源字典

但是构造函数完成后,AccentComplimentBrush class的一个实例(它是一个子class ViewModelBase) 被添加到具有相同键的资源字典中,并替换您的免费颜色。

所以最终 XAML 会在运行时将 ViewModelBase 分配给 Fill 属性,因此会出现错误。