【问题标题】:Runtime change Resource Dictionary for a Windows 8.1 XAML Store AppWindows 8.1 XAML Store 应用程序的运行时更改资源字典
【发布时间】:2015-08-18 11:42:52
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • Oki,我现在有一个半工作模型。我必须在我的 App.xaml.cs 文件中为整个应用程序删除并重新创建我的内容框架对象。我认为这可能是前进的方向。

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


【解决方案1】:

这可以使用主题来完成。有一个方便的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的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多