- 浏览: 140172 次
文章分类
最新评论
win10 uwp 切换主题
本文主要说如何在UWP切换主题,并且如何制作主题。
一般我们的应用都要有多种颜色,一种是正常的白天颜色,一种是晚上的黑夜颜色,还需要一种辅助的高对比颜色。这是微软建议的,一般应用都要包含的颜色。
我们还可以自己定义多种颜色,例如金属、海蓝之光、彩虹雨。然而微软给我们的切换,简单只有亮和暗。
那么问题就是我们如何切换我们的主题。
在这前,我们先说如何制作主题,其实主题就是Dictionary,我们在解决方案加上两个文件夹,一个是View,一个是ViewModel,其中View将会放主题,如果主题比较多,还可以在View加一个文件夹。
首先在View文件夹新建资源
我根据原文说的新建几个资源叫LightThemeDictionary、DarkThemeDictionary,一个是白天颜色,一个是黑暗
然后我们在我们的资源写入几个资源
<ResourceDictionary
xmlns="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的资源
<ResourceDictionary
xmlns="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
{
get
{
return _theme;
}
set
{
_theme = value;
OnPropertyChanged();
}
}
private ElementTheme _theme = ElementTheme.Light;
}
我们绑定Page.RequestedTheme
先在xaml.cs写
private ViewModel.ViewModel View { set; get; }=new ViewModel.ViewModel();
然后在xaml
<Page
x: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,大概就是这样做。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
相关推荐
在UWP(Universal Windows Platform)应用开发中,换肤功能是一项重要的用户体验设计,它允许用户根据个人喜好更改应用的主题色、背景图片等视觉元素,从而提升应用的个性化和吸引力。UWP的换肤通常涉及到以下几个...
借助 Windows Explorer 上的这种现代 UWP,以更有效,更令人满意的方式管理文件 我们认为我们大多数人都可以同意 Windows 10 是迄今为止 Microsoft 操作系统的最佳版本,尽管它具有各种可感知的或多或少的主观缺点...
综上所述,这份《win10开发.pdf》文档是全面的开发者指南,它不仅涵盖了Windows 10平台的最新API,还提供了详细的教学教程和样例代码,帮助开发者快速掌握UWP应用开发的各个方面。无论是初学者还是有经验的开发者,...
在Windows 10操作系统中,内置了一系列的应用程序,如邮件、日历、照片、音乐、电影与电视等,这些应用通常被称为"Modern"或"UWP"(通用Windows平台)应用。然而,有些用户可能并不需要所有预装的应用,或者希望优化...
标题 "win10iot(树莓派2)GPIO输入输出" 涉及到的是在Windows 10 IoT Core(简称Win10IoT)操作系统上,利用树莓派2的GPIO引脚进行数字信号的输入与输出操作。Win10IoT是微软为物联网设备开发的一个轻量级版本的操作...
可在 Mac 上运行 Win10 UWP 通用应用、使用 Win 版的 Office 办公软件、IE 或 Edge 浏览器、运行所有 Windows 程序、玩游戏,新版支持 USB-C/3.0,并大幅改进性能,绝对是 Mac 用户必备神器……
在Windows 10操作系统中,用户有时希望卸载预装的现代应用(也称为Windows Store应用或UWP应用),以释放存储空间或者优化系统性能。本文档提供了详细步骤,指导如何通过PowerShell来卸载Win10自带的应用软件。 ...
- **Modern UI 的演变**:Windows 10 中的 Modern UI(现称为 UWP 应用)在设计上进行了调整,旨在提供更加统一且流畅的用户体验。 - **适应性设计**:Modern UI 的应用能够更好地适应不同屏幕尺寸和设备类型,无论...
可不重启直接在Mac系统上运行Win10UWP通用应用、运行游戏、使用Windows版的应用软件如Office办公软件、IE浏览器、VisualStudio、AutoCAD等。新版支持USB-C/3.0,性能提升同时大幅减小硬盘占用空间,绝对是Mac用户...
**Windows Terminal for Win10** Windows Terminal 是微软为Windows 10操作系统推出的一款现代终端工具,它整合了多个命令行环境,如CMD、PowerShell、WSL(Windows Subsystem for Linux)等,提供了多标签、自定义...
此外,Windows 10还支持开发UWP(通用Windows平台)应用,这些应用能够在各种Windows 10设备上运行,包括PC、平板和手机。 在系统管理和维护方面,两本书都会教导读者如何利用内置工具进行系统诊断、性能监控和故障...
此外,Windows 10的文件资源管理器还支持OneDrive云服务的无缝集成,使得用户可以方便地在本地和云端之间切换和管理文件。 Windows 10的搜索功能也进行了增强,除了在开始菜单中整合了Cortana(小娜)智能助手外,...
在本篇讨论中,我们将深入探讨如何在Windows 10平台上使用通用Windows平台(UWP)进行桌面编程,特别是聚焦于UWP中的焦点管理和多页面切换功能。标题提及的"UWP Focus(N之5)"暗示我们正在一系列教程中学习,而这一...
在本篇中,我们将深入探讨Windows 10编程中的一个重要概念——通用Windows平台(UWP)的焦点管理,这是在创建高效且用户友好的应用程序时不可或缺的部分。标题“Windows 10编程:UWP Focus(N之3)”暗示了我们将...
Windows 10 系统的多桌面显示和多任务视窗功能是其高效工作和学习的重要工具,极大地提升了用户在处理多个任务时的便捷性。接下来我们将深入探讨这两个功能。 首先,我们来看“多桌面视窗”功能。在Windows 10中,...
《Realtek音频控制台1.2.169.0:恢复与管理Windows 10音效的必备工具》 在数字音频技术日新月异的今天,Realtek作为知名的半导体公司,为用户提供了丰富的音频解决方案。在Windows 10操作系统中,Realtek的音频驱动...
`avbuild` 是一个针对 FFmpeg 的构建工具,专门设计来简化 FFmpeg 在不同平台上的编译过程,如 iOS、Android、Raspberry Pi、Win32、UWP、Linux 和 macOS 等。 1. **跨平台编译**: - `avbuild` 提供了一种统一的...
在Windows 10操作系统中,有时用户在卸载Modern应用(也称为Windows Store应用或UWP应用)后,发现它们的图标仍然保留在开始菜单或任务栏上,这可能会引起困扰。以下是一些方法,可以帮助你彻底删除这些已经卸载的...
Windows SDK 10.0.14393.0 是针对Windows 10操作系统的一个开发工具包,它是Visual Studio 2015的重要组成部分,主要用于帮助开发者创建、测试和调试针对Windows 10的应用程序。SDK(Software Development Kit)包含...
Win32 API(Application ...然而,随着.NET框架和现代开发技术的发展,如Windows Forms、WPF、UWP等,虽然直接使用Win32 API的情况逐渐减少,但对理解底层机制和解决特定问题时,Win32 API仍然是不可或缺的知识。