Windows 8.1 XAML Store App 的运行时更改资源字典

Runtime change Resource Dictionary for a Windows 8.1 XAML Store App

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

我这样做是因为我想根据视口大小为我的应用程序设置不同的字体大小、缩放比例等。

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

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);

这适用于初始加载。当我更改我的视口时,这段代码确实再次被点击,但是在资源字典被清除并重新加载后,我的应用程序的 fonts/styles/etc 根本没有改变。

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

有谁知道可以强制我的应用程序根据新的资源字典值重新绘制自身的方法吗?

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

不要在应用加载时加载主题,而是将它们放入应用 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 的更多信息。