运行时更改Windows 8.1 XAML商店应用程序的资源字典

时间:2015-08-18 11:42:52

标签: xaml windows-store-apps windows-8.1 winrt-xaml

我正在尝试在运行时动态更改应用程序的资源字典定义。

我这样做是因为我希望根据视口大小为我的应用程序提供不同的字体大小,缩放等。

我目前有以下代码,每次视口大小改变时都会执行:

string stylesPath;

if (args.Type == "small")
{
    stylesPath = "ms-appx:///Styles/small.xaml";
}
else
{
    stylesPath = "ms-appx:///Styles/standard.xaml";
}

var resourceDictionary = new ResourceDictionary
{
    Source = new Uri(stylesPath, UriKind.RelativeOrAbsolute)
};

Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);

这适用于初始加载。当我更改我的视口时,这个代码再次被击中,但在清除并重新加载资源字典后,我的应用程序的字体/样式/等根本不会改变。

应用程序样式似乎只会在应用程序启动时加载一次。

有没有人知道我可以强制我的应用程序根据新的资源字典值重绘自己的方式?

1 个答案:

答案 0 :(得分:1)

这可以使用主题来完成。有一个方便的nuget package,称为主题管理器,可以很容易地切换主题。

不要在app app上加载主题,而是将它们放在你的app ThemeDictionaries

<ResourceDictionary.ThemeDictionaries>
    <ResourceDictionary x:Key="Dark">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Themes/small.xaml"/>
            <ResourceDictionary Source="/Themes/standard.xaml"/>
        </ResourceDictionary.MergedDictionaries>
   </ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>

然后你可以改变这样的主题:

var url = new Uri(string.Format("ms-appx:///Themes/{0}.xaml", (args.Type == "small") ? "small" : "standard"));
ThemeManager.ChangeTheme(url);

您可以阅读有关ThemeManager here的更多信息。