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

XAML-UWP Windows 10中的免费强调色,xaml,win-universal-app,xamlparseexception,Xaml,Win Universal App,Xamlparseexception,我正试图让一个按钮在采取行动后改变颜色。我的按钮的背景设置为SystemControlBackgroundAccentBrush,我基本上希望在单击后获得“相反/互补”的颜色 我发现这篇文章: 这似乎是我要找的。我不得不稍微修改一下代码,因为它似乎是针对windows phone而不是UWP的。下面是我更改的类,但请注意,我没有包含上面文章中的全部代码,因为它没有更改: public class AccentComplimentBrush : ViewModelBase { /// &

我正试图让一个按钮在采取行动后改变颜色。我的按钮的背景设置为
SystemControlBackgroundAccentBrush
,我基本上希望在单击后获得“相反/互补”的颜色

我发现这篇文章:

这似乎是我要找的。我不得不稍微修改一下代码,因为它似乎是针对windows phone而不是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);
        }
    }
}
公共类:ViewModelBase
{
/// 
///资源名称-应用程序中可引用的资源名称
/// 
private const string ResourceName=“accents”;
/// 
///初始化类的新实例。
/// 
公共英语
{
尝试
{
////这在设计器中不起作用-所以不要尝试
如果(此.IsInDesignMode)
{
返回;
}
//请确保我们不会多次尝试添加资源-这是可能的
//如果在多个页面或应用程序和页面中引用,则会发生此情况
if(!Application.Current.Resources.ContainsKey(ResourceName))
{
var currentAccentColorHex=(SolidColorBrush)Application.Current.Resources[“SystemControlBackgroundAccentBrush”];
var hsl=HslColor.FromColor(currentAccentColorHex.Color);
hsl.converttocomplement();
颜色赞美=hsl.ToColor();
Application.Current.Resources.Add(ResourceName,新的SolidColorBrush(恭维));
}
}
捕获(异常exc)
{
System.Diagnostics.Debug.WriteLine(“出现问题-要求退款”);
系统诊断调试写线(exc);
}
}
}
这是如何从XAML调用它的:

  • 首先初始化类(并且初始化为ok)

    
    
  • 当它遍历上述类的代码时,它会找到相关资源,获取相关颜色,获取互补颜色,并将其转换回资源,并将其添加到应用程序的资源中。如前所述,我已经检查了所有这些,一切正常

  • 请注意,它是一个圆形按钮,包含一个椭圆,我正试图将笔划和填充属性指定给新笔刷:

    <Ellipse Stroke="{StaticResource AccentComplimentBrush}"
             Fill="{StaticResource AccentComplimentBrush}"
             StrokeThickness="2">
    </Ellipse>
    
    
    
    这是我得到的错误:

    找不到与此错误代码关联的文本。 未能分配到属性“Windows.UI.Xaml.Shapes.Shape.Fill”。[行:301位置:46]

    从错误来看,它似乎在分配类生成的“笔刷”时遇到了问题

    请注意,如果我硬编码一个
    ThemeResource
    或一个实际颜色,那么
    椭圆
    代码就可以正常工作

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


    谢谢。

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

    <common:AccentComplimentBrush x:Key="whatever" />
    
    
    
    是的,
    AccentComplaidBrush
    类的构造函数中,首先使用键
    AccentComplaidBrush
    将互补颜色(SolidColorBrush)添加到资源字典中

    <common:AccentComplimentBrush x:Key="whatever" />
    
    但是构造函数完成后,
    类的一个实例(它是ViewModelBase的一个子类)将使用相同的键添加到资源字典中,并替换您的补充颜色


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

    解决方案就是简单地将
    修改为
    以外的任何内容

    <common:AccentComplimentBrush x:Key="whatever" />
    
    
    
    是的,
    AccentComplaidBrush
    类的构造函数中,首先使用键
    AccentComplaidBrush
    将互补颜色(SolidColorBrush)添加到资源字典中

    <common:AccentComplimentBrush x:Key="whatever" />
    
    但是构造函数完成后,
    类的一个实例(它是ViewModelBase的一个子类)将使用相同的键添加到资源字典中,并替换您的补充颜色


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

    我以为我以前试过,但又试了一次,以防万一,我还是会犯同样的错误。还有其他建议吗?在我修改密钥名称后,它工作正常,请从我的代码中获取并自己检查。这很奇怪!我下载了你的示例,我认为这是因为你将这个静态资源分配给网格的背景,而不是按钮,但我刚刚复制/粘贴了我的按钮,它按预期工作,但我无法为我的生活找出为什么它仍然不为我工作。我花了一个小时左右的时间来来回比较这两个,看不出有什么不同。我的类肯定已初始化,但它仍然告诉它找不到该资源。我会继续研究它,当我发现它是什么时会更新!可能和往常一样愚蠢!一分钟比一分钟更陌生。现在,我的类将不会被初始化,这可能是为什么我仍然得到这个错误,但我知道它最初是在我发布这个问题之前被初始化的。快把我逼疯了!我会继续找的!看来这一直都是我的问题。我很困惑我怎么会错过这个,但是我的画笔在我认为是的时候没有被初始化,这才是真正的问题。我仍然不明白为什么当我的其他资源(如viewmodels和Converter)被调用时它没有被初始化,但现在我的工作是在调用InitializeComponents之前在视图中创建类,这解决了问题