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调用它的:
<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之前在视图中创建类,这解决了问题