首页 > 其他分享 >Avalonia 11中动态变更主题和颜色的方法

Avalonia 11中动态变更主题和颜色的方法

时间:2023-09-15 17:25:00浏览次数:37  
标签:11 ThemeType themeStylesContainer Current static using App 变更 Avalonia

      首先添加一个这个工具类:

using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Styling;
using Avalonia.Themes.Fluent;
using Avalonia.Themes.Simple;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AvaloniaChangeTheme.Views
{
    public enum ThemeType
    {
        Fluent,
        Simple
    }

    public static class AppThemeUtils
    {
        private static readonly Styles _themeStylesContainer = new();
        private static FluentTheme _fluentTheme;
        private static SimpleTheme _simpleTheme;
        private static IStyle _colorPickerFluent, _colorPickerSimple;
        private static IStyle _dataGridFluent, _dataGridSimple;

        public static void BeforeInitialize()
        {
            App.Current.Styles.Add(_themeStylesContainer);
        }

        public static void AfterInitialize()
        {
            _fluentTheme = (FluentTheme)App.Current.Resources["FluentTheme"]!;
            _simpleTheme = (SimpleTheme)App.Current.Resources["SimpleTheme"]!;
            _colorPickerFluent = (IStyle)App.Current.Resources["ColorPickerFluent"]!;
            _colorPickerSimple = (IStyle)App.Current.Resources["ColorPickerSimple"]!;
            _dataGridFluent = (IStyle)App.Current.Resources["DataGridFluent"]!;
            _dataGridSimple = (IStyle)App.Current.Resources["DataGridSimple"]!;

            SetTheme(ThemeType.Fluent);
        }

        private static ThemeType _prevTheme;
        public static ThemeType CurrentTheme => _prevTheme;

        public static void SetTheme(ThemeType theme)
        {
            var app = (App)App.Current!;

            var prevTheme = _prevTheme;
            _prevTheme = theme;
            var shouldReopenWindow = prevTheme != theme;

            if (_themeStylesContainer.Count == 0)
            {
                _themeStylesContainer.Add(new Style());
                _themeStylesContainer.Add(new Style());
                _themeStylesContainer.Add(new Style());
            }

            if (theme == ThemeType.Fluent)
            {
                _themeStylesContainer[0] = _fluentTheme!;
                _themeStylesContainer[1] = _colorPickerFluent!;
                _themeStylesContainer[2] = _dataGridFluent!;
            }
            else if (theme == ThemeType.Simple)
            {
                _themeStylesContainer[0] = _simpleTheme!;
                _themeStylesContainer[1] = _colorPickerSimple!;
                _themeStylesContainer[2] = _dataGridSimple!;
            }

            if (shouldReopenWindow)
            {
                if (app.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
                {
                    var oldWindow = desktopLifetime.MainWindow;
                    var newWindow = new MainWindow();
                    desktopLifetime.MainWindow = newWindow;
                    newWindow.Show();
                    oldWindow?.Close();
                }
                else if (app.ApplicationLifetime is ISingleViewApplicationLifetime singleViewLifetime)
                {
                    singleViewLifetime.MainView = new MainView();
                }
            }
        }
    }

}

     在App.xaml中,将原来的这一段删掉,因为会在代码中创建:

 <Application.Styles>
     <FluentTheme/>
 </Application.Styles>

     添加下面的内容:

<Application.Resources>
    <ResourceDictionary>
        <!-- Resources used only in the control catalog -->
        <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Default">
                <Color x:Key="CatalogBaseLowColor">#33000000</Color>
                <Color x:Key="CatalogBaseMediumColor">#99000000</Color>
                <Color x:Key="CatalogChromeMediumColor">#FFE6E6E6</Color>
                <Color x:Key="CatalogBaseHighColor">#FF000000</Color>
            </ResourceDictionary>
            <ResourceDictionary x:Key="Dark">
                <Color x:Key="CatalogBaseLowColor">#33FFFFFF</Color>
                <Color x:Key="CatalogBaseMediumColor">#99FFFFFF</Color>
                <Color x:Key="CatalogChromeMediumColor">#FF1F1F1F</Color>
                <Color x:Key="CatalogBaseHighColor">#FFFFFFFF</Color>
            </ResourceDictionary>
        </ResourceDictionary.ThemeDictionaries>

        <!-- Styles attached dynamically depending on current theme (simple or fluent) -->
        <FluentTheme x:Key="FluentTheme">
        </FluentTheme>
        <SimpleTheme x:Key="SimpleTheme" />
        <StyleInclude x:Key="DataGridFluent" Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml" />
        <StyleInclude x:Key="DataGridSimple" Source="avares://Avalonia.Controls.DataGrid/Themes/Simple.xaml" />
        <StyleInclude x:Key="ColorPickerFluent" Source="avares://Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml" />
        <StyleInclude x:Key="ColorPickerSimple" Source="avares://Avalonia.Controls.ColorPicker/Themes/Simple/Simple.xaml" />
    </ResourceDictionary>
</Application.Resources>

       完整示例可以看这里:

https://github.com/bodong1987/AvaloniaSamples/tree/main/AvaloniaChangeTheme

 

标签:11,ThemeType,themeStylesContainer,Current,static,using,App,变更,Avalonia
From: https://www.cnblogs.com/bodong/p/17705522.html

相关文章

  • win11显示星期
    点击"开始"菜单,在搜索框输入"区域"点击"其他设置"--"日期"在短日期后面加上"ddd"或者"dddd"注意要和前面的日期用空格、/、-等字符分开ddd代表周一dddd代表星期一为了尽可能短,我把年去掉了,用的是ddd的周格式......
  • window11恢复右键展示完整菜单
    //终端->右键管理员身份运行regadd"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"/f/ve(附[恢复window11右键模式]:regdelete"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32......
  • 部署 kn v1.11.0
    下载kn#wgethttps://github.com/knative/client/releases/download/knative-v1.11.0/kn-linux-amd64部署kn#mvkn-linux-amd64/usr/local/bin/kn#chmod+x/usr/local/bin/kn验证kn#knversionVersion:v1.11.0BuildDate:2023-07-2707:42:56GitRevis......
  • 3.11 Java运算符优先级
    所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数......
  • 20211326德永学习笔记2
    第九章总结要点1.I/O库函数与系统调用系统调用函数:open()、read()、write()、lseek()、close();I/O库函数:fopen()、fread()、fwrite()、flseek()、fclose()。I/O库函数一一对应地依赖于系统调用函数。2、I/O库函数的算法-2.1fread算法在第一次调用fread()时,FILE结构体的缓......
  • 总结2011,展望2012
           首先祝愿大家新年快乐,快乐2012。       回首2011一年里和acm结缘,有幸自己能接触这项赛事中,上半年自己刷水题,参加新生赛、校赛什么的全部被虐爆了。然后不知不觉的挥霍了两个月没做什么题,到了署假,各种排位赛还是逃不了被虐的命运,各路大神碉堡了。区域赛组队......
  • 1131 Subway Map
    题目:Inthebigcities,thesubwaysystemsalwayslooksocomplextothevisitors.Togiveyousomesense,thefollowingfigureshowsthemapofBeijingsubway.Nowyouaresupposedtohelppeoplewithyourcomputerskills!Giventhestartingpositionofy......
  • 11种语言对世界say world
    学习编程的旅程,往往以一个简单的"Hello,World!"程序开始。这个小小的程序看似不起眼,但它蕴含着深刻的意义,是探索编程世界的第一步。当你编写并运行"Hello,World!"程序时,你实际上完成了几个重要的事情:建立环境:你首次安装了编程语言的开发环境,这意味着你为自己创建了一个数字......
  • C++11之智能指针(万字长文详解)
    C++11之智能指针为什么需要智能指针#include<iostream>usingnamespacestd;intdiv(){inta,b;cin>>a>>b;if(b==0)throwinvalid_argument("除0错误");returna/b;}voidFunc(){//1、如果p1这......
  • 9.11CF1819 题解
    9.11CF1819题解A.ConstructiveProblem简单题,上链接:链接B.TheButcher题意有一张 \(h\timesw\) 的纸片,现在对这张纸片进行 \(n−1\) 次裁剪。每次裁剪后会将其中一半收归(即这一半不会再被裁剪)。保证纸片不会被旋转。告诉你最终裁剪后的 \(n\) 张纸片长宽,问初始......