Win UI3开发笔记(四)设置主题

Win UI3设置主题过程

参考文章网址:https://blog.csdn.net/white_night_SZTU/article/details/132819719
核心代码:

rootElement.RequestedTheme = ElementTheme.Dark;
//这和在前端设置控件的 RequestedTheme="Dark"属性是一样的

结果:可以改变按钮或控件的字体颜色。
但是如果当前页面自定义了颜色就不能更改,而且不能改变标题栏的颜色。

//xaml中指定如果在此置顶颜色则无法更改
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"

github上也有类似的:https://github.com/microsoft/microsoft-ui-xaml/issues/6938,其中是导航栏中的文字在黑暗模式下会变白,但是整个导航栏不会,经建议在grid属性中加上

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<NavigationView/>
</Grid>

但是如果我想在黑暗和明亮时自定义不同的颜色,该怎么实现呢?
由此引出官方文档中给出的资源字典。
官方主题资源相关文档:
https://learn.microsoft.com/zh-cn/windows/apps/design/style/xaml-resource-dictionary
你可以使用 XAML 为你的应用定义 UI 或资源。 资源通常是一些你预期多次使用的对象的定义。 为了在以后引用 XAML 资源,你为资源指定一个键,用于充当其名称。 你可以在整个应用中或从应用中的任意 XAML 页面引用资源。 你可以使用 Windows 运行时 XAML 中的 ResourceDictionary 元素定义你的资源。 然后,可使用 StaticResource 标记扩展或 ThemeResource 标记扩展来引用你的资源。
你最希望声明为 XAML 资源的 XAML 元素包括 Style、ControlTemplate、动画组件和 Brush 子类。 我们在此处介绍如何定义 ResourceDictionary 和键控资源,以及 XAML 资源与你定义为应用或应用包一部分的其他资源有何关系。 我们还介绍资源字典高级功能,如 MergedDictionaries 和 ThemeDictionaries。

当前单个界面的资源使用<Page.Resources>定义并使用StaticResource引用。
所有的资源都要定义x:key
如果没有关键字,定义TargetType="Button"其中的样式会作用于button控件。
添加资源在 Application.OnLaunched方法中添加

还可以单独定义一个资源字典页面,“添加”>新建项目…”>“资源字典”,

 <Page.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Dictionary1.xaml"/></ResourceDictionary.MergedDictionaries><x:String x:Key="greeting">Hello world</x:String></ResourceDictionary>

主题资源和主题字典:

ThemeDictionaries 内的每个 ResourceDictionary 元素必须具有一个 x:Key 值。 该值是一个字符串,它为相关主题命名,例如 “Default”、“Dark”、“Light”或“HighContrast”。
其中,Light下红色Dark下黑色确实能够在本机两种主题下显示不同的颜色。但是上一个例子中的代码不能改变它的颜色。

XAML 主题资源

可能上述是因为定义的是TextBlock的StaticResource?

原文讲到:在应用加载时和随后每次在运行时更改主题时,发生{ThemeResource}标记扩展评估。仅在应用首次加载 XAML 时评估{StaticResource}标记扩展。

如何自定义主题资源?
原文:
在以下位置使用 {ThemeResource} 标记扩展:Styles、Setters、Control 模板、Property 资源库和 Animations。
注意请勿在你的 ThemeDictionaries 内的资源定义中使用 {ThemeResource} 标记扩展。 改用 {StaticResource} 标记扩展。
winui-gallery中对于主题的设定:

<ComboBox x:Name="themeMode" AutomationProperties.AutomationId="themeModeComboBox" SelectionChanged="themeMode_SelectionChanged"><ComboBoxItem Content="Light" Tag="Light" /><ComboBoxItem Content="Dark" Tag="Dark" /><ComboBoxItem Content="Use system setting" Tag="Default" />
</ComboBox>private void themeMode_SelectionChanged(object sender, RoutedEventArgs e)
{var selectedTheme = ((ComboBoxItem)themeMode.SelectedItem)?.Tag?.ToString();var window = WindowHelper.GetWindowForElement(this);string color;if (selectedTheme != null){ThemeHelper.RootTheme = App.GetEnum<ElementTheme>(selectedTheme);if (selectedTheme == "Dark"){TitleBarHelper.SetCaptionButtonColors(window, Colors.White);color = selectedTheme;}else if (selectedTheme == "Light"){TitleBarHelper.SetCaptionButtonColors(window, Colors.Black);color = selectedTheme;}else{color = TitleBarHelper.ApplySystemThemeToCaptionButtons(window) == Colors.White  ? "Dark" : "Light";}// announce visual change to automationUIHelper.AnnounceActionForAccessibility(sender as UIElement, $"Theme changed to {color}","ThemeChangedNotificationActivityId");}
}

另一个winui相关的实例中:

var selectedTheme = ((RadioButton)sender)?.Tag?.ToString();
if (selectedTheme != null)
{((sender as RadioButton).XamlRoot.Content as SplitView).RequestedTheme = GetEnum<ElementTheme>(selectedTheme);
}

另一个的实例中:
颜色主题资源的定义

<ResourceDictionary x:Key="Dark"><Thickness x:Key="CardBorderThickness">1</Thickness><StaticResource x:Key="CardBorderBrush" ResourceKey="CardStrokeColorDefaultBrush" /><StaticResource x:Key="CardPrimaryForegroundBrush" ResourceKey="TextFillColorPrimaryBrush" /><StaticResource x:Key="CardBackgroundBrush" ResourceKey="CardBackgroundFillColorDefaultBrush" />
</ResourceDictionary>

简单地说,现在的问题是如何随意切换主题的时候使得某个元素显示不同的且是自定义的颜色?
参照上述的例子,定义不同模式下的资源字典:

<ResourceDictionary.ThemeDictionaries><ResourceDictionary x:Key="Light"><SolidColorBrush x:Key="myBrush" Color="Red"/></ResourceDictionary><ResourceDictionary x:Key="Dark"><SolidColorBrush x:Key="myBrush" Color="Blue"/></ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>

使用动态资源进行绑定,即ThemeResource

<TextBlock Foreground="{ThemeResource brush}" Text="hello world" VerticalAlignment="Center"/>

这样,使用最开始的方法会自动切换。
但是再次运行页面解析失败了,所以还是定义两个字典文件。
如果是一个页面的背景颜色使用这种方法定义可以吗?
定义字典文件之后引用的时候要在page标签中加Page.resource标签,但是如果定义page的背景颜色在page标签中,如果在page标签中定义背景颜色为字典中定义的动态颜色就会报错。
直接在page中定义grid,定义grid中的背景颜色属性绑定。

下一个问题是自定义标题栏以及右上角三个按钮的背景颜色定义:由于标题栏本身具有的特征是在titlebar文件中定义的,所以可以直接在文件中定义标题栏的背景颜色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorFlow中的分布式深度学习

在处理复杂问题和大规模深度学习问题时&#xff0c;分布式深度学习为我们提供了突破口。它允许我们利用多个设备和计算资源的力量&#xff0c;更好地训练我们的模型。讨论这个话题时&#xff0c;不得不提的是 TensorFlow&#xff0c;它通过 tf.distribute 包为分布式学习提供了…

Apriori 与 FP-growth 算法

关联规则挖掘:Apriori 与 FP-growth 算法 关联规则挖掘概述Apriori 算法基本原理应用实例FP-growth 算法基本原理应用实例其他机器学习算法:机器学习实战工具安装和使用关联规则挖掘是数据挖掘领域中的一个重要任务,旨在发现数据集中不同项之间的关联关系。Apriori 算法和 F…

面试精选-前端

1、防抖 防抖 (Debouncing) 的含义是指在一定时间内&#xff0c;多次触发同一个事件&#xff0c;只执行最后一次操作。例如&#xff0c;当我们在搜索框中输入关键词时&#xff0c;输入框会不断触发oninput事件&#xff0c;如果每次输入都去请求服务器获取数据&#xff0c;会造…

idea集成git(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…

Go编译到linux运行出现 cannot execute binary file

1.初学Go就在windows上写了个"Hello,World!",在windown上编译了一下&#xff0c;生成了可执行文件。运行无问题 go build text.go .\text.exe Hello,World!2.但是按照网上的教程进行生成linux的可执行文件时出现报错 set CGO_ENABLED0 set GOOSlinux set GOARCHam…

程序媛的mac修炼手册-- 2024如何彻底卸载Python

啊&#xff0c;前段时间因为想尝试chatgpt的API&#xff0c;需要先创建一个python虚拟环境来安装OpenAI Python library. 结果&#xff0c;不出意外的出意外了&#xff0c;安装好OpenAI Python library后&#xff0c;因为身份认证问题&#xff0c;根本就没有获取API key的权限…

Git命令操作

什么是Git&#xff1f; Git是⼀个免费的&#xff0c;开源的分布式版本控制软件系统 git区域 存储区域&#xff1a;Git软件⽤于存储资源得区域。⼀般指得就是.git⽂件夹 ⼯作区域&#xff1a;Git软件对外提供资源得区域&#xff0c;此区域可⼈⼯对资源进⾏处理。 暂存区&am…

Escalate_Linux(3)--通过读取密码文件shadow来破解root用户的口令实现提权

通过读取密码文件shadow来破解root用户的口令实现提权 通过读取密码文件/etc/shadow来破解root用户的口令 ls -l /etc/shadow 普通用户无查看shadow权限 echo "cat /etc/shadow" >/tmp/ls ​ chmod 755 /tmp/ls ​ export PATH/tmp:$PATH ​ /home/user5/script…

Ubuntu中Python包的寻找路径

文章目录 一、Pyhon包的查找位置二、某个Python特定包的查找位置参考 一、Pyhon包的查找位置 ▶ [~]$ python -m site sys.path [/home/wangji,/usr/lib/python310.zip,/usr/lib/python3.10,/usr/lib/python3.10/lib-dynload,/home/wangji/.local/lib/python3.10/site-packag…

[C++]c++冒泡排序示例

冒泡排序是一种计算机科学领域的较简单的排序算法&#xff0c;这篇文章主要介绍了c冒泡排序示例,需要的朋友可以参考下 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff0c;是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个…

019 Spring Boot+Vue 电影院会员管理系统(源代码+数据库+文档)

部分代码地址&#xff1a; https://github.com/XinChennn/xc019-cinema 一、系统介绍 cinema项目是一套电影院会员管理系统&#xff0c;使用前后端分离架构开发包含管理员、会员管理、会员卡管理、电影票、消费记录、数据统计等模块 二、所用技术 后端技术栈&#xff1a; …

RabbitMQ-消息队列:优先级队列、惰性队列

20、优先级队列 在我们系统中有一个订单催付的场景&#xff0c;我们的客户在天猫下的订单&#xff0c;淘宝会及时将订单推送给我们&#xff0c;如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒&#xff0c;很简单的一个功能对吧。 但是&#xff0c;天猫商家对我…

Apache Flume:分布式日志收集系统

什么是Apache Flume&#xff1f; Apache Flume 是一个分布式、可靠、高可用的服务&#xff0c;用于高效收集、聚合和移动大量日志数据。它的主要目标是将日志数据从源头传输到中央数据存储&#xff0c;如Hadoop的HDFS。Flume 是为了可靠地处理日志数据而设计的&#xff0c;它有…

【数据结构】周末作业

1.new(struct list_head*)malloc(sizeof(struct list_head*)); if(newNULL) { printf("失败\n"); return; } new->nextprev->next; prev->nextnew; return; 2.struct list_head* pprev->next; prev->nextp->next; p->next->prevpr…

【Java程序员面试专栏 算法思维】一 高频面试算法题:排序算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊排序算法,包括手撕排序算法,经典的TOPK问题以及区间合并,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间快速排序双指针+递归+基准值分…

一种基于道路分类特性的超快速车道检测算法

摘要&#xff1a; 本文介绍了一种新颖、简单但有效的车道检测公式。 车道检测是自动驾驶和高级驾驶员辅助系统 (ADAS) 的基本组成部分&#xff0c;在实际高阶驾驶辅助应用中&#xff0c;考虑车道保持、转向、限速等相关的控制问题&#xff0c;这种方式通常是通过受限的车辆计算…

MATLAB环境下基于图像处理的视网膜图像血管分割

预防糖尿病对每个人的健康至关重要&#xff0c;而糖尿病的早期症状在眼底视网膜血管会有所体现&#xff0c;如静脉血管扩张、轻度弯曲等。高血压作为常见疾病&#xff0c;在中国有多达2.45亿的患者。高血压的病情也会在眼底视网膜血管上有所体现&#xff0c;如交叉压迫征等反映…

鸿蒙开发【WebGL】简单了解

WebGL的全称为Web Graphic Library(网页图形库)&#xff0c;主要用于交互式渲染2D图形和3D图形。目前HarmonyOS中使用的WebGL是基于OpenGL裁剪的OpenGL ES&#xff0c;可以在HTML5的canvas元素对象中使用&#xff0c;无需使用插件&#xff0c;支持跨平台。WebGL程序是由JavaScr…

UE5 C++ TPS开发 学习记录(六)

这节课学习了如何创建插件,在Build.cs内使用模块和创建OnlineSubsystem // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Subsystems/GameInstanceSubsystem.h" #incl…

前端页面可视化大屏适配方案

无论窗口缩放&#xff0c;屏幕放大缩小&#xff0c;我们的可视化界面都可以按照设计图比例正常展示&#xff0c;不会出现字体模块爆出&#xff0c;或者拉伸问题。这就是我想要的适配方案。 html <div id"appRef"><div>html页面</div> </div&g…