首页 > 其他分享 >Avalonia 动态设置主题和色彩

Avalonia 动态设置主题和色彩

时间:2025-01-19 23:10:54浏览次数:1  
标签:Dark object isDark 主题 Current Application 动态 色彩 Avalonia

四套主题Default、Forest、Lavender、Nighttime,2种色彩Dark和Light

不同主题下需要显示的颜色不同,不同的色彩需要显示的图标颜色不同。

首先需要4个主题样式文件 Default.axmal、Forest.axmal、Lavender.axmal、Nighttime.axmal

2套图标资源,Dark和Light

动态实现:
1.资源(举个例子)
<ResourceDictionary xmlns="https://github.com/avaloniaui"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    >
  <Design.PreviewWith>
    <Border Margin="20"></Border>
  </Design.PreviewWith>
  <!-- Add Resources Here -->
  <ResourceDictionary.ThemeDictionaries>
  <ResourceDictionary x:Key="Dark">
    <Bitmap x:Key="default">avares://YourProjectName/Assets/Dark/default.png</Bitmap>
    <Bitmap x:Key="auto">avares://YourProjectName/Assets/Dark/auto.png</Bitmap>
    <Bitmap x:Key="close">avares://YourProjectName/Assets/Dark/close.png</Bitmap>
  </ResourceDictionary>
  </ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>

2.动态加载资源:

#region 定义主题色切换方法
/// <summary>
/// 切换为浅色主题
/// </summary>
public void SwitchToThemeColor(bool isDark)
{
    if (Application.Current is { } app)
    {
        if (isDark)
        {
            app.RequestedThemeVariant = ThemeVariant.Dark;
        }
        else
        {
            app.RequestedThemeVariant = ThemeVariant.Light;
        }
        ThemeColorInit(isDark);
    }
}
/// <summary>
/// 主题色切换
/// </summary>
/// <param name="themeName">主题名称</param>
/// <param name="isDark">色彩类型</param>
public void SwitchToTheme(string themeName, bool isDark)
{
    if (StyleIncludes.ContainsKey(themeName))
    {
        var styleInclude = StyleIncludes[themeName];

        // 清空所有旧样式
        Application.Current.Styles.Clear();

        // 加载主题样式
        Application.Current.Styles.Add(styleInclude);
        Application.Current.Styles.Add(DefultStyle);

        if (isDark)
        {
            Application.Current.RequestedThemeVariant = ThemeVariant.Dark;
        }
        else
        {
            Application.Current.RequestedThemeVariant = ThemeVariant.Light;
        }
        ThemeColorInit(isDark);
    }
}
/// <summary>
/// 通过选择的颜色主题,动态载入资源字典
/// </summary>
private void ThemeColorInit(bool isDark)
{
    try
    {
        var resources = App.Current.Resources.MergedDictionaries;

        // 清除现有资源字典
        resources.Clear();

        // 加载新的资源字典
        string sourceUri = isDark
            ? "avares://YourProjectName/Resources/DarkResource.axaml"
            : "avares://YourProjectName/Resources/LightResource.axaml";

        var newResources = new ResourceInclude(new Uri(sourceUri))
        {
            Source = new Uri(sourceUri)
        };

        resources.Add(newResources);
    }
    catch(Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}
#endregion

2.Image 绑定
2.1(硬绑定)
<Image Source="{DynamicResource close}" Width="25" Height="25"/>
2.2 动态绑定(根据当前设置的色彩动态更新)
<Image Source="{Binding Icon, Converter={StaticResource ResourceKeyConverter}}" Margin="0,10,0,5" Width="25" Height="25"/>

ResourceKeyConverter的实现(Conver文件)
/// <summary>
/// ResourceKey״̬
/// </summary>
public class ResourceKeyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string resourceKey)
        {
            // 获取当前主题
            var currentTheme = Application.Current.RequestedThemeVariant;
            // 根据当前主题获取相应的资源字典
            string themeKey = currentTheme == ThemeVariant.Dark ? "Dark" : "Light";

            if (Application.Current?.Resources.TryGetResource(resourceKey, currentTheme, out var resource) == true)
            {
                return resource;
            }
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

标签:Dark,object,isDark,主题,Current,Application,动态,色彩,Avalonia
From: https://www.cnblogs.com/ff-king/p/18680465

相关文章

  • 基础动态规划讲解
    (标题就叫这个吧,我也没什么主意了)动态规划,要给这个这个东西下个定义,确实不太好下,他是一种基于状态来思考问题的算法思想用来表示状态的话,那就是dp,(这么说好抽象),就直接说涉及动态规划的题目怎么处理吧,这个还是有步骤可行的,就按如下步骤操作1.寻找子问题2.找出状态转移方程3.最......
  • 蓝桥杯备赛笔记(九)动态规划(一)
    1.动态规划基础(1)线性DP1)什么是DP(动态规划)DP(动态规划)全称DynamicProgramming,是运筹学的一个分支,是一种将复杂问题分解成很多重叠的子问题,并通过子问题的解得到整个问题的解的算法。在动态规划中有一些概念:状态:就是形如dp[i][j]=val的取值,其中i,j为下标,也是用于描述、......
  • 动态规划——26单词拆分
    这道题用代码随想录的解释有点牵强,第二层for循环和递推公式也没有说明白。代码classSolution{public:boolwordBreak(strings,vector<string>&wordDict){unordered_set<string>set(wordDict.begin(),wordDict.end());//字典单词是物品,s是背包......
  • 深入探索 Vue.js 最新组件开发技术:实现动态模块加载器
    随着前端技术的飞速发展,Vue.js的组件化开发理念已经被广泛应用。今天,我们将探索一种最新的技术模式:动态模块加载器在Vue.js中的实现。这种模式可以提升应用的性能,并简化大型项目的组件管理。为什么需要动态模块加载器?在传统的Vue.js开发中,我们经常通过import和requir......
  • 【SCI一区复现】基于配电网韧性提升的应急移动电源预配置和动态调度(上)—MPS预配置(Ma
        ......
  • 【SCI一区复现】基于配电网韧性提升的应急移动电源预配置和动态调度(上)—MPS预配置(Ma
        ......
  • 动态规划(dp数组)
    动态规划,是利用历史记录来避免重复计算的一种算法,是求解决策过程最优化的过程。一般用一维数组/二维数组来保存历史记录。(将原问题拆解成若干子问题,同时保存子问题的答案,使每个子问题只求解一次,最终获得原问题的答案。)一般动态规划有三个步骤:1.定义数组元素的含义,一般求什么就......
  • 4-08动态绑定_多态
    多继承无函数覆盖structBase1 { public: virtualvoidFn_1() { printf("Base1:Fn_1...\n"); } virtualvoidFn_2() { printf("Base1:Fn_2...\n"); } }; structB......
  • 关于动态规划
    主要问题大概是动规基础(斐波那契),背包,打家劫舍,股票,子序列。解决也主要是先分类,建立dp数组,明确dp数组的含义,dp数组的初始化,遍历顺序。动规基础斐波那契数列,爬楼梯,建立dp数组的时候,递推公式的推导就要参考建立dp数组并且明确dp数组的含义比如下面的最小花费爬楼梯,明确含义就可以在......
  • 动态代理IP池管理:避免爬虫被封禁的高效策略
    在进行大规模数据抓取时,反爬虫机制经常成为爬虫开发者的一大难题。许多网站通过监测请求频率、User-Agent、IP地址等信息来识别并封禁爬虫。为了防止这种情况,动态代理IP池的管理变得尤为重要。通过使用代理IP池,并定期更换IP,可以有效避开基于IP的封禁策略。本篇博客将深入......