国内的WPF技术先行者周银辉曾介绍过如何动态改变应用程序的主题样式,今天我们来介绍一种轻量级的改变界面风格的方式——动态改变主题色。
程序允许用户根据自己的喜好来对界面进行配色,这种技术在很多软件中都有应用,比如这款名为AirPlay的音乐播放器软件:

下面我们就来自己动手实现这种技术:
首先在App.xaml文件中定义一个键值为“color”的单色笔刷,这个笔刷就是可以被用户改变的动态资源:

<SolidColorBrush x:Key="color" Color="SkyBlue" />

然后来设计这样一个界面:

我们让用户通过4个滑块来分别定制颜色的A、R、G、B值,其完整代码为:

<Grid>

<Grid.RowDefinitions>

<RowDefinition Height="28" />

<RowDefinition Height="28" />

<RowDefinition Height="28" />

<RowDefinition Height="28" />

<RowDefinition Height="*" />

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="65*" />

<ColumnDefinition Width="213*" />

</Grid.ColumnDefinitions>

<Label Grid.Row="0" HorizontalContentAlignment="Right">透明度:</Label>

<Label Grid.Row="1" HorizontalContentAlignment="Right">红色:</Label>

<Label Grid.Row="2" HorizontalContentAlignment="Right">绿色:</Label>

<Label Grid.Row="3" HorizontalContentAlignment="Right">蓝色:</Label>

<Slider Grid.Row="0" Grid.Column="1" Margin="3" Name="a" SmallChange="1" LargeChange="15" Maximum="255" Value="255" />

<Slider Grid.Row="1" Grid.Column="1" Margin="3" Name="r" SmallChange="1" LargeChange="15" Maximum="255" Value="255" />

<Slider Grid.Row="2" Grid.Column="1" Margin="3" Name="g" SmallChange="1" LargeChange="15" Maximum="255" Value="255" />

<Slider Grid.Row="3" Grid.Column="1" Margin="3" Name="b" SmallChange="1" LargeChange="15" Maximum="255" Value="255" />

<Button Grid.Column="1" Grid.Row="4" HorizontalAlignment="Left" Margin="3,5,0,5" Name="button1" Width="75" Click="button1_Click">更新颜色</Button>

</Grid>

需注意,要把滑块的最大值设为255。

然后回到App.xaml中,我们来定义窗口、标签及按钮的样式:

窗口样式代码如下:

<Style x:Key="window" TargetType="Window">

<Setter Property="OverridesDefaultStyle" Value="true" />

<Setter Property="AllowsTransparency" Value="true" />

<Setter Property="SnapsToDevicePixels" Value="true" />

<Setter Property="WindowStyle" Value="None" />

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="Window">

<Border BorderBrush="{DynamicResource color}" BorderThickness="3" CornerRadius="5" Padding="4">

<Border BorderBrush="{DynamicResource color}" BorderThickness="3" CornerRadius="5" Background="{DynamicResource color}">

<Border BorderBrush="#1000" BorderThickness="3" CornerRadius="5" Padding="6">

<Border.Background>

<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

<GradientStop Color="#3FFF" Offset="0.5" />

<GradientStop Color="#1666" Offset="0.5" />

</LinearGradientBrush>

</Border.Background>

<ContentPresenter />

</Border>

</Border>

</Border>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

定义样式为几个Border进行嵌套,在最底层引用的之前定义的单色笔刷,在上层用低不透明度的白色和黑色覆盖以产生不同的层次效果。

标签样式为:

<Style TargetType="Label">

<Setter Property="Foreground" Value="#AAFFFFFF" />

</Style>

按钮样式为:

<Style TargetType="Button">

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="Button">

<Border Background="{DynamicResource color}" CornerRadius="3">

<Border BorderThickness="2" CornerRadius="3" Padding="{TemplateBinding Padding}">

<Border.Background>

<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

<GradientStop Color="#6FFF" Offset="0" />

<GradientStop Color="#2000" Offset="1" />

</LinearGradientBrush>

</Border.Background>

<Border.BorderBrush>

<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

<GradientStop Color="#1000" Offset="0" />

<GradientStop Color="#4000" Offset="1" />

</LinearGradientBrush>

</Border.BorderBrush>

<TextBlock TextAlignment="Center" Foreground="#AFFF"><ContentPresenter /></TextBlock>

</Border>

</Border>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

其原理与窗口样式相同。

然后回到主界面设计窗口,设置窗体的样式:

Style="{StaticResource window}"

接下来编辑后台代码,首先为窗体增加事件处理以提供拖动功能:

MouseLeftButtonDown="Window_MouseLeftButtonDown"

后台事件处理代码:

private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

{

this.DragMove();

}

为按钮增加事件处理来更新界面颜色:

private void button1_Click(object sender, RoutedEventArgs e)

{

更新颜色(Color.FromArgb((byte)a.Value, (byte)r.Value, (byte)g.Value, (byte)b.Value));

}

“更新颜色”方法代码如下:

public void 更新颜色(Color c)

{

this.Resources.Remove("color");

this.Resources.Add("color", new SolidColorBrush(c));

}

此方法首先移除资源“color”,然后再添加一个同名的新笔刷,这样就完成了动态替换工作。

现在编译并执行程序,可以看到如下效果:

源代码下载

转载于:https://www.cnblogs.com/SkyD/archive/2008/09/02/1281975.html

WPF动态改变主题颜色相关推荐

  1. vue 动态改变主题颜色

    实现效果 一.应用方法 1.css3伪类选择器 2.CSSStyleDeclaration.setProperty() 方法接口为一个声明了 CSS 样式的对象设置一个新的值 . 语法   style ...

  2. vue动态改变主题颜色

    新建.scss后缀公用文件,放在assets或者其他地方都可以 /*需要切换的颜色变量*/ $color-primary1:#1776E1; /* 更换的颜色 */ $color-primary2:# ...

  3. antd动态换主题颜色

    1.下载插件 npm add antd-theme-generator && yarn add antd-theme-generator 2.根目录添加color.js const p ...

  4. elementui :on-remove怎么用_Vue + Vuex + Element UI实现动态全局主题颜色

    点击右上方红色按钮关注"web秀",让你真正秀起来 前言 经常用Element UI的小伙伴,应该知道,Element UI官方文档,可以自由更换主题.那么,我们怎么把这个功能用到 ...

  5. 一键换肤--动态更换主题颜色风格

    基于前一段时间项目具有换肤需求的功能,几经预研学习换肤功能效果,网上的资源很多,最初看到是网易换肤的酷炫效果,今天得空打算写一篇关于换肤功能的文章,项目无需重启Activity的就可以实现无缝换肤切换 ...

  6. 点击echarts柱状图动态改变数据项颜色样式

    首先附上参考文章连接:https://blog.csdn.net/weixin_42870683/article/details/103528254添加链接描述 今天来实现点击echarts柱状图,动 ...

  7. mpvue微信小程序中使用svg图标,并通过代码动态改变图标颜色

    微信小程序,mpvue中使用svg图标,并通过代码改变图标颜色 本文主要是mpvue开发小程序的代码,不过微信小程序原生开发应该也是一样的,思路都是通用的,按照这个思路微信小程序原生开发一样可以实现同 ...

  8. 产品经理:来做个APP根据用户手机壳颜色来改变主题颜色

    昨日,程序员暴打产品经理的视频,在网络传开 据说是因为,产品经理提了一个匪夷所思的需求 "根据用户手机壳颜色来改变app主题颜色" 然后,这位兄弟达成了程序员圈子里令人骄傲的成就: ...

  9. Android开发——Java代码动态改变图片颜色

    前言 在Android开发当中,我们会遇到多张图片需要改变背景颜色,我们不能用代码写死,但是我们setBackgroundColor方法改变是会被把我们背景变成直角的,但是从用户体验感的角度来讲是带有 ...

最新文章

  1. 如何调用DLL (基于Visual C++6.0的DLL编程实现)
  2. python yield用法举例说明
  3. SAP Fiori Elements 里 Smart Table column 的宽度问题
  4. X3C to X9T
  5. python如何定义类_python类定义的讲解
  6. android限制安装包来源,Android系统设置settings应用学习(一)--允许未知来源应用安装...
  7. libc.so.6被删后导致系统无法使用的原因及解决方法
  8. FFMpeg (一) av_register_all()
  9. 蚂蚁Java高端培训视频教程-每特学院,蚂蚁课堂
  10. STM32-RTC实时时钟-毫秒计时实现
  11. 「POJ2826」An Easy Problem?!【计算几何】
  12. 5e检索服务器信息,服务器检索 - 找服玩|Minecraft服务器列表
  13. [转载] 过 DNF TP 驱动保护
  14. 如何将docx文件制作为ftl模板
  15. linux 文本三剑客之sed编辑器
  16. 悲催:一个80后程序员的爱情故事【视频】-但愿我不是那个陈旭阳!55...
  17. ImportError: DLL load failed while importing qhull:问题解决
  18. Overload resolution ambiguity. All these functions match. kotlin 开发问题日常记录
  19. php imap 安装_php怎么安装imap扩展
  20. java JVM 内存结构

热门文章

  1. 华为系统p40pro计算机,华为P40 Pro:我来了!
  2. 用python实现bt下载_python实现bt种子 torrent转magnet
  3. 数据分析:星巴克店铺分布有何规律?
  4. c语言计算器程序代码 链栈,【C语言】简易科学计算器源代码(链栈应用)(原创).doc...
  5. android 内存抖动_android内存泄漏怎么破?一招教你搞定!
  6. MySQL延时更改数据_mysql数据库备份设置延时备份方法(mysql主从配置)
  7. Linux内核源代码分析——中断(一鞭一条痕)(上)
  8. 用GDB调试PHP扩展
  9. matlab作图图例,为scatter3 plot创建图例(Matlab)
  10. 大橙子_【大橙子喜讯】工程学子斩获佳绩!——机械创新设计大赛