【问题标题】:Complimentary accent color in XAML - UWP Windows 10XAML 中的免费强调色 - UWP Windows 10
【发布时间】:2016-05-27 04:03:40
【问题描述】:

我正在尝试获取一个按钮以在执行操作后更改颜色。我的按钮背景设置为SystemControlBackgroundAccentBrush,我基本上想在点击后获得“相反/互补”颜色。

我找到了这篇文章:

Using a complimentary accent color

这似乎是我想要的。我不得不稍微修改一下代码,因为它似乎特定于 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);
        }
    }
}

这是从 XAML 中调用它的方式:

  1. 首先类被初始化(并且它被初始化好了)

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

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

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

这是我得到的错误:

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

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

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

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

谢谢。

【问题讨论】:

    标签: xaml win-universal-app xamlparseexception


    【解决方案1】:

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

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

    是的,AccentComplimentBrush 类的构造函数中,首先将互补色(一个SolidColorBrush)添加到具有键AccentComplimentBrush 的资源字典中。

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

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

    【讨论】:

    • 我以为我以前尝试过,但为了以防万一,我又试了一次,我仍然得到同样的错误。还有其他建议吗?
    • 修改键名后正常,请从OneDrive获取我的代码并自行检查。
    • 这很奇怪!我已经下载了您的示例,我认为这是因为您将此静态资源分配给网格的背景而不是按钮,但我刚刚复制/粘贴了我的按钮,它按预期工作,但我无法弄清楚我的生活为什么它仍然不适合我。我花了最后一个小时左右来回走动,比较两个,看不出有什么区别。我的课程肯定已经初始化,但它仍然告诉它找不到该资源。当我发现它是什么时,我会继续研究它并更新它!可能像往常一样愚蠢!
    • 越来越陌生。现在,我的类将不会被初始化,这可能是我仍然收到此错误的原因,但我知道在发布此问题之前它最初已被初始化。快把我逼疯了!我会继续寻找!
    • 看来这一直是我的问题。我很困惑我是如何错过的,但是我的 AccentComplimentBrush 没有被初始化,当我认为它是,这确实是问题所在。我仍然无法弄清楚为什么当我的其他资源(即视图模型和转换器)被初始化时它没有被初始化,但现在我的解决方法是在调用 InitializeComponents 之前在视图中创建类,这解决了问题。如果我无法弄清楚这一点,我将为这个问题创建一个单独的问题。再次感谢您的帮助。
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多