我有一个Xamarin Forms应用程序,带有用于Android和IOS的MvvmCross,我想添加一个深色主题。我的想法是必须使用词典来列出深色或浅色主题,并在启动时加载我需要的主题。
我在MvxApplication中注册了依赖项后添加了它:
if (Mvx.IoCProvider.Resolve<ISettingsManager>().Theme == AppTheme.Dark)
{
Application.Current.Resources.Add(new ColorsDark());
}
else
{
Application.Current.Resources.Add(new ColorsLight());
}
ColorsDark
和ColorsLight
是我的ResourceDictionary。之后,我可以在Application.Current.Resources.MergedDictionaries
下看到新的Dictionary,但是控件无法像看起来那样找到资源。但是,当我将其添加到App.xaml
<ResourceDictionary Source="Style/ColorsDark.xaml" />
我是否必须将代码的另一部分移到其他地方,或者根本就是错误的方法?
答案 0 :(得分:1)
个人根本不喜欢这种方法。我的工作:拥有一个静态类,其中包含所有在静态字段中定义的颜色,大小等。在应用启动或更改皮肤后重新加载应用时,只需为此用户界面定义静态类调用ex:UiSettings.Init()
,如下所示:
public static class UiSettings
{
public static Init()
{
if (Settings.AppSettings.Skin=="butterfly")
{
ColorButton = Color.Blue;
TitleSize= 12.0;
}
else
if (Settings.AppSettings.Skin=="yammy")
{
ColorButton = Color.Red;
if (Core.IsAndroid)
ButtonsMargin = new Thickness(0.5,0.6,0.7,0.8);
}
// else just use default unmodified field default values
}
public static Color ColorButton = Color.Green;
public static Thickness ButtonsMargin = new Thickness(0.3,0.3,0.2,0.2);
public static double TitleSize= 14.0;
}
在XAML使用示例中:
Color= "{x:Static xam:UiSettings.ColorProgressBack}"
在代码使用示例中:
Color = UiSettings.ColorProgressBack;
更新: 请记住,如果您从不同的程序集中访问静态类,则可能会使用未发生Init()的默认值访问它的新副本,如果您也遇到这种情况,也可以从该程序集中调用Init()。 / p>
答案 1 :(得分:0)
如果您希望在应用程序加载时加载某些内容,则必须在App.xaml.cs中进行编码
ExtentProperties.INSTANCE
在这段代码中,我将设置所有页面的BackgroungImage。希望您能从这段代码中得到灵感。