代码之家  ›  专栏  ›  技术社区  ›  ctrlplusb

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

  •  0
  • ctrlplusb  · 技术社区  · 11 年前

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

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

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

    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 回复  |  直到 11 年前
        1
  •  1
  •   Shawn Kendrot    11 年前

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