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

时间:2016-02-16 03:14:28

标签: xaml win-universal-app xamlparseexception

一旦采取行动,我正试图让按钮改变颜色。我的按钮的背景设置为SystemControlBackgroundAccentBrush,我基本上想要在点击后获得'对立/互补'颜色。

我找到了这篇文章:

Using a complimentary accent color

这似乎就像我在寻找的那样。我不得不稍微修改一下代码,因为它似乎特定于Windows手机而不是UWP。下面是我更改的课程,但请注意我没有包含上面文章中的整个代码,因为它保持不变:

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. 首先初始化类(并初始化确定)

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

  3. 请注意,它是一个圆形按钮,它包含一个椭圆,我正在尝试将笔触和填充属性分配给新笔刷:

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

    这是我得到的错误:

      

    找不到与此错误代码关联的文本。   无法分配给属性'Windows.UI.Xaml.Shapes.Shape.Fill'。 [线:301位置:46]

    从错误中看,分配由该类生成的“画笔”时会出现问题。

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

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

    感谢。

1 个答案:

答案 0 :(得分:0)

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

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

是的, AccentComplimentBrush类的构造函数,首先将补充颜色(SolidColorBrush)添加到资源字典中,其中包含键{{ 1}}。

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

因此,最终XAML会在运行时将ViewModelBase分配给Fill属性,从而导致错误。