【问题标题】:System.InvalidCastException: 'Specified cast is not valid.' App.Current.Resources["theme_bg_color"] = Color.White;System.InvalidCastException:“指定的演员表无效。” App.Current.Resources["theme_bg_color"] = Color.White;
【发布时间】:2021-11-10 20:55:00
【问题描述】:

试图在 ResourceDictionary 中设置 Color 的值。 [App.xaml]

<Color x:Key="theme_bg_color">#3E98EB</Color>

以下行的异常:

App.Current.Resources["theme_bg_color"] = Color.White;

【问题讨论】:

  • 我没有立即发现问题。下面是我接下来要尝试的:作为测试,如果那行代码之前运行这一行:var oldValue = App.Current.Resources["theme_bg_color"];,会发生什么?使用调试器断点,因此您可以单步执行代码,请参阅“locals 窗格”中的oldValue。我有两个问题:1)这行新代码是否给出了一些例外?如果是这样,是什么? 2) 如果没有例外,oldValue 显示的值是多少? (不太确定我要去哪里;只是想了解更多关于正在发生的事情。)
  • 另外,你用什么方法放了那行代码?也许它需要在启动序列中稍后移动。奇怪的是,它在一个模板中起作用,而在另一个模板中不起作用。 App.Current.Resources 在两个项目中是否具有相同的 type
  • @ToolmakerSteve 正如你所说,我添加了代码: var oldValue = App.Current.Resources["theme_bg_color"];请查看类型和结果。我分享了上面的截图。
  • 谢谢,我知道了

标签: xamarin.forms


【解决方案1】:

它需要一个对象类型,所以需要转换成一个对象。

public static class ThemeHandler
{
    public static Dictionary<int, Color> DictColors = new Dictionary<int, Color>()
    {
        {0, Color.FromHex("#0A65C0") },
        {1, Color.FromHex("#C54786") },
        {2, Color.DarkSalmon },
        {3, Color.FromHex("#3E98EB") },
        {4, Color.FromHex("#66CCCD") },
        {5, Color.FromHex("#008069") },
        {6, Color.Teal },
        {7, Color.FromHex("#5F259F") },
        {8, Color.Purple },
        {9, Color.FromHex("#C71585") },
        {10, Color.DarkSlateGray },
        {11, Color.FromHex("#466599") },
        {12, Color.SlateGray },
        {13, Color.Gray },
        {14, Color.DimGray },
        {15, Color.FromHex("#121212") }
    };

    public static void SetTheme(ThemeColor color)
    {
        try
        {
            App.ThemeColor = color;
            int index = (int)color;

            // Reduce color dencity use (+), Increase color dencity use (-)
            var fadecolor = DictColors[index].WithLuminosity(DictColors[index].Luminosity + (DictColors[index].Luminosity * .15));
            App.Current.Resources["theme_bg_color"] = (object)DictColors[index];
            App.Current.Resources["icon_bg_color"] = index == 0 ? (object)Color.White : (object)DictColors[index];
            App.Current.Resources["sub_icon_bg_color"] = (object)DictColors[index];
            App.Current.Resources["theme_bg_fade_color"] = fadecolor;
            App.Current.Resources["theme_txt_color"] = (object)Color.White;
        }
        catch (System.Exception ex)
        {

        }
    }

}

我们也可以这样写:

App.Current.Resources["theme_bg_color"] = (object)ColorDictionary[index];

xaml:

BackgroundColor="{DynamicResource theme_bg_color}"

【讨论】:

  • 每个值类型都可以通过装箱在 C# 中自动转换为object,为什么需要显式转换?这有什么不同?
  • @Lasse V. Karlsen - 我知道,我的旧代码是这样的:App.Current.Resources["theme_bg_color"] = ColorDictionary[index];但它不理解,当我转换它的工作正常时。
【解决方案2】:

我写了一个小例子供大家参考,实现了Application.Resources里面Color的设置。

App.xml代码如下:

<Application.Resources>
    <Color x:Key="ButtonTest">red</Color>
    <Style TargetType="{x:Type Button}"
           ApplyToDerivedTypes="True">
        <Setter Property="BackgroundColor"
                Value="{StaticResource ButtonTest}" />
    </Style>
</Application.Resources>

然后在 xaml 中创建 Button。 欲了解更多信息,请参阅 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/resource-dictionaries

【讨论】:

  • 我还添加了与您显示的相同的代码。但我需要在 red 上动态更改值。这就是我尝试代码的原因:App.Current.Resources["theme_bg_color"] = Color.White;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2023-04-10
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多