title author date CreateTime categories
win10 uwp 切换主题
lindexi
2019-09-02 12:57:38 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文主要说如何在UWP切换主题,并且如何制作主题。

一般我们的应用都要有多种颜色,一种是正常的白天颜色,一种是晚上的黑夜颜色,还需要一种辅助的高对比颜色。这是微软建议的,一般应用都要包含的颜色。

我们还可以自己定义多种颜色,例如金属、海蓝之光、彩虹雨。然而微软给我们的切换,简单只有亮和暗。

那么问题就是我们如何切换我们的主题。

在这前,我们先说如何制作主题,其实主题就是Dictionary,我们在解决方案加上两个文件夹,一个是View,一个是ViewModel,其中View将会放主题,如果主题比较多,还可以在View加一个文件夹。

首先在View文件夹新建资源

我根据原文说的新建几个资源叫LightThemeDictionary、DarkThemeDictionary,一个是白天颜色,一个是黑暗

然后我们在我们的资源写入几个资源

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:NightDayThemeToggleButton.View"><SolidColorBrush x:Key="SystemBackgroundAltHighBrush" Color="#FFF0F0F0"/><SolidColorBrush x:Key="SystemBackgroundBaseHighBrush" Color="#FF101010"/><Color x:Key="SystemTranslucentBaseHighColor">#FF000000</Color><Color x:Key="SystemThemeMainColor">#FF0074CE</Color>
</ResourceDictionary>

然后在黑暗也写相同key的资源

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:NightDayThemeToggleButton.View"><SolidColorBrush x:Key="SystemBackgroundAltHighBrush" Color="#FF1A1C37"/><SolidColorBrush x:Key="SystemBackgroundBaseHighBrush" Color="#FFDFDFDF"/><Color x:Key="SystemTranslucentBaseHighColor">#FFFFFFFF</Color><Color x:Key="SystemThemeMainColor">#FF0074CE</Color>
</ResourceDictionary>

然后我们需要在前台把资源放在Page

 <Page.Resources><ResourceDictionary><ResourceDictionary.ThemeDictionaries><ResourceDictionary x:Key="Light" Source="View/DarkThemeDictionary.xaml"></ResourceDictionary><ResourceDictionary x:Key="Dark" Source="View/LightThemeDictionary.xaml"></ResourceDictionary></ResourceDictionary.ThemeDictionaries></ResourceDictionary></Page.Resources>

我们使用资源需要ThemeDictionaries,这个是主题

记住要把资源一个叫x:Key="Light"一个Dark,原因在下面会说。

我们建立ViewModel,其中ViewModel继承NotifyProperty,这是一个我写的类,这个类主要是INotifyPropertyChanged,如果自己写ViewModel也好

ViewModel建立在ViewModel文件夹,一般少把类名称和文件夹一样

我们ViewModel主要是属性ElementTheme Theme,ElementTheme 有Default,Light,Dark,就是我们要把key叫light和dark,这样就可以绑定ViewModel修改

viewModel

 public class ViewModel : NotifyProperty{public ViewModel(){}public ElementTheme Theme{set{_theme = value;OnPropertyChanged();}get{return _theme;}}private ElementTheme _theme = ElementTheme.Light;}

我们绑定Page.RequestedTheme

先在xaml.cs写

 private ViewModel.ViewModel View { set; get; }=new ViewModel.ViewModel();

然后在xaml

<Pagex:Class="NightDayThemeToggleButton.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:NightDayThemeToggleButton"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"RequestedTheme="{x:Bind View.Theme,Mode=OneWay}">

我们要看到变化,在xaml使用

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid Background="{ThemeResource SystemBackgroundAltHighBrush}"><ToggleSwitch HorizontalAlignment="Center" Toggled="ToggleSwitch_OnToggled"></ToggleSwitch></Grid></Grid>

SystemBackgroundAltHighBrush是我们两个资源的,其中一个是白天,一个不是

 private void ToggleSwitch_OnToggled(object sender, RoutedEventArgs e){View.Theme = View.Theme == ElementTheme.Light ? ElementTheme.Dark :ElementTheme.Light;}

运行可以看到点击就变成白天颜色,再点击就变为黑暗,这就是uwp切换主题,这样主题颜色很少,只有两个。

参见:https://embracez.xyz/xaml-uwp-themes/

我们总是会使用白天,夜间模式,那么我们需要切换主题,UWP切换主题简单

下面使用我做的一个按钮

夜间白天主题按钮

NightDayThemeToggleButton

我做的还有游戏键,这些都是可以简单使用的控件

这些控件放在https://github.com/lindexi/UWP,大家可以拿下来用。

做一个按钮,其实是修改

 <Style x:Key="NightDayThemeToggleButton" TargetType="CheckBox"><Setter Property="Background" Value="Transparent"/><Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}"/><Setter Property="Padding" Value="8,5,0,0"/><Setter Property="HorizontalAlignment" Value="Left"/><Setter Property="VerticalAlignment" Value="Center"/><Setter Property="HorizontalContentAlignment" Value="Left"/><Setter Property="VerticalContentAlignment" Value="Top"/><Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/><Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/><Setter Property="MinWidth" Value="120"/><Setter Property="MinHeight" Value="32"/><Setter Property="UseSystemFocusVisuals" Value="True"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="CheckBox"><Grid BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"><VisualStateManager.VisualStateGroups><VisualStateGroup x:Name="CombinedStates"><VisualState x:Name="UncheckedNormal"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Light" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="1"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Dark" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="0"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="UncheckedPointerOver"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Light" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="1"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Dark" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="0"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="UncheckedPressed"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Light" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="1"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Dark" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="0"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="UncheckedDisabled"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Light" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="1"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Dark" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="0"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="CheckedNormal"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Light" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="0"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Dark" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="1"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="CheckedPointerOver"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Light" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="0"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Dark" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="1"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="CheckedPressed"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Light" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="0"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Dark" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="1"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="CheckedDisabled"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Light" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="0"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="Dark" Storyboard.TargetProperty="Opacity"><DiscreteObjectKeyFrame KeyTime="0" Value="1"></DiscreteObjectKeyFrame></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="IndeterminateNormal"><Storyboard></Storyboard></VisualState><VisualState x:Name="IndeterminatePointerOver"><Storyboard></Storyboard></VisualState><VisualState x:Name="IndeterminatePressed"><Storyboard></Storyboard></VisualState><VisualState x:Name="IndeterminateDisabled"><Storyboard></Storyboard></VisualState></VisualStateGroup></VisualStateManager.VisualStateGroups><Image x:Name="Light" Source="Assets/weather_sun.png"></Image><Image x:Name="Dark" Source="Assets/weather_moon.png"></Image></Grid></ControlTemplate></Setter.Value></Setter></Style>

需要使用也简单,可以使用

<CheckBox Margin="16,193,0,75" Style="{StaticResource NightDayThemeToggleButton}" IsChecked="{x:Bind AreChecked,Mode=TwoWay}"></CheckBox>

这样复制我上面代码就好,如果想用我的控件,可以

<local:NightDayThemeToggleButton ></local:NightDayThemeToggleButton>

上面用到两张图片,一张是白天,一张是夜晚

首先我们是编辑副本,不知道这个在哪的可以去看我的入门http://blog.csdn.net/lindexi_gd/article/details/52041944,里面有很多连接

然后我们可以看到

<VisualState x:Name="UncheckedNormal">

我们把下面自带所有控件都删掉,然后添加两个Image,当然需要给他们x:Name

接着在上面添加透明度从1到0或从0到1,大概就是这样做。

UWP 和系统一样的主题

UWP如果想保持主题和系统一样,随着系统主题,简单方法,在App.xaml,删除RequestedTheme="Light"

因为在UWP,没有给他一个值,就会和系统一样,但是在我们app运行,改变系统主题,我们就没办法立刻就随着系统改,这个我们不需要去想,因为在之后,垃圾wr自己去弄

http://stackoverflow.com/a/39898422/6116637

2019-9-2-win10-uwp-切换主题相关推荐

  1. win10 uwp 切换主题

    本文主要说如何在UWP切换主题,并且如何制作主题. 一般我们的应用都要有多种颜色,一种是正常的白天颜色,一种是晚上的黑夜颜色,还需要一种辅助的高对比颜色.这是微软建议的,一般应用都要包含的颜色. 我们 ...

  2. 【Win10 UWP】QQ SDK(一):SDK基本使用方法

    每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...

  3. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  4. 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用

    协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...

  5. WIN10 自动切换夜间模式

    WIN10 自动切换夜间模式 介绍 系统版本 步骤 1. 更改power shell执行策略,以便能执行切换脚本 2.创建切换脚本 3. 添加脚本到任务计划程序中 介绍 Win10 现在还没有自动切换 ...

  6. win10 uwp 通过 Win2d 完全控制笔迹绘制逻辑

    本文来告诉大家如何通过 Win2d 完全控制笔迹绘制逻辑,本文适合用来实现复杂的自定义逻辑,可以完全控制笔迹的行为.包括在书写过程中切换模式,如进行手势擦除切换为橡皮擦模式 本文提供的方法适合用来做复 ...

  7. win10 UWP 应用设置

    win10 UWP 应用设置 简单的把设置需要的,放到微软自带的LocalSettings LocalSettings.Values可以存放几乎所有数据 如果需要存放复合数据,一个设置项是由多个值组成 ...

  8. 源码推荐:仿写映客直播 ,快速切换主题 ,星星评分控件,表格样式,可以横向移动的表格, 仿微信键盘-

    仿写映客直播(上传者:五仁月饼) 工作之余写的,基于IJKPlayer播放,对内存做了处理.目前已完成直播列表和直播间的搭建,后续还会慢慢完善. 项目地址 publishImageAndVideoAn ...

  9. vue动态发布到线上_vue在线动态切换主题色方案

    主要原理是利用webpack插件webpack-theme-color-replacer提取相关颜色css然后根据配置动态生成替换的css 具体实现步骤如下: 1.添加webpack插件,新建文件we ...

  10. Thinkphp动态切换主题

    'DEFAULT_THEME' => '2014', 'TMPL_DETECT_THEME' => true, // 自动侦测模板主题 'THEME_LIST' => '2012,2 ...

最新文章

  1. Java中四则运算的那些坑
  2. 视图的getWidth()和getHeight()返回0
  3. 特斯拉无人驾驶却在高速路驰骋,四名乘客喝酒唱歌开party,网友:12分应该扣给谁?...
  4. svn迁移,备份,重装系统后恢复数据
  5. 解决 WPF 绑定集合后数据变动界面却不更新的问题
  6. frm文件导入mysql5.7_使用frm,ibd文件恢复数据库文件,mysql5.7.31,centos7.5,20200813...
  7. php 获取 get变量,php – 在Laravel中获取GET“?”变量
  8. wait方法为什么要放在循环里
  9. 我的世界java版种子多村庄_《我的世界》“村庄与掠夺”PE版种子推荐,出生点就7个村庄相连...
  10. PCB设计敷铜时的天线效应
  11. dev、test 和 prod 是什么意思?
  12. 2021年「通信安全员」通用基础及岗位技能(通信安全员)考试资料
  13. SLAM学习笔记(Code3)----Eigen库中的Geometry
  14. 如何做一名优秀的程序员?
  15. u盘插电脑上不显示怎么办?数据恢复还有希望吗
  16. 集合竞价选股(股票)
  17. PMI-ACP敏捷管理认证的含金量
  18. Codeforces 715A Plus and Square Root
  19. 利用高德地图实现定位功能
  20. CSS3 弹性布局/伸缩布局 flex

热门文章

  1. excel最大行数各版本介绍
  2. SNF开发平台WinForm之六-上传下载组件使用-SNF快速开发平台3.3-Spring.Net.Framework
  3. Sutton reinforcement learning _ Chapter 2 Multi-armed Bandits
  4. 爬虫 一些爬取图片时出现的错误
  5. simulink官方电机控制示例汇总
  6. (CVE-2014-0160) OpenSSL 心脏滴血漏洞
  7. 创新实训(11)——推荐系统实现之基于流行度和新鲜度的推荐
  8. vant 中 van-address-edit地址编辑 地址回显获取 areaCode
  9. choco 代理强制失效方法
  10. 【Codeforces思维题】20220728