博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF之动态换肤
阅读量:6543 次
发布时间:2019-06-24

本文共 4433 字,大约阅读时间需要 14 分钟。

如何实现换肤呢,对于复杂的换肤操作,如,更换按钮样式、窗口样式等,我们需要写多个资源字典来表示不同的皮肤,通过动态加载不同的资源字典来实现换肤的效果;对于简单的换肤操作,如更改背景颜色、设置窗体透明度,这种换肤操作,我们就不能使用上面的方法了,这个时候,我们只要在一个全局对象中添加几个属性,如背景颜色、前景颜色、窗体透明度等,然后,再绑定这几个属性就能达到我们想要的效果。

 

解决方案:动态加载资源字典

1 
5
6
7
8
9
12
22 23
24
25
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace DynamicallySkinnable{    ///     /// MainWindow.xaml 的交互逻辑    ///     public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();        }        private void Button_Click(object sender, RoutedEventArgs e)        {            Button btn = (Button)e.OriginalSource;            btn.ContextMenu.IsOpen = true;        }        private void menuAero_Click(object sender, RoutedEventArgs e)        {            /*            Application.Current.Resources.MergedDictionaries.Clear();   //清除现有资源            //获取要应用的资源字典            ResourceDictionary resource =                (ResourceDictionary)Application.LoadComponent(                    new Uri("/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/aero.normalcolor.xaml", UriKind.Relative));            //将资源字典合并到当前资源中            Application.Current.Resources.MergedDictionaries.Add(resource);             */            //this.Resources.MergedDictionaries.Clear();            ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(new Uri("/DynamicallySkinnable;component/Skins/BlueSkin.xaml", UriKind.Relative));            this.Resources.MergedDictionaries.Add(resource);        }        private void menuRoyale_Click(object sender, RoutedEventArgs e)        {            /*            Application.Current.Resources.MergedDictionaries.Clear();            ResourceDictionary resource =                (ResourceDictionary)Application.LoadComponent(                    new Uri("/PresentationFramework.Royale, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/royale.normalcolor.xaml", UriKind.Relative));            Application.Current.Resources.MergedDictionaries.Add(resource);             */            //this.Resources.MergedDictionaries.Clear();            ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(new Uri("/DynamicallySkinnable;component/Skins/RedSkin.xaml", UriKind.Relative));            this.Resources.MergedDictionaries.Add(resource);                   }        private void menuLuna_Click(object sender, RoutedEventArgs e)        {            /*            Application.Current.Resources.MergedDictionaries.Clear();            ResourceDictionary resource =                (ResourceDictionary)Application.LoadComponent(                    new Uri("/PresentationFramework.Luna, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/luna.normalcolor.xaml", UriKind.Relative));            Application.Current.Resources.MergedDictionaries.Add(resource);             */            //this.Resources.MergedDictionaries.Clear();            ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(new Uri("/DynamicallySkinnable;component/Skins/BlackSkin.xaml", UriKind.Relative));            this.Resources.MergedDictionaries.Add(resource);        }        private void button1_Click(object sender, RoutedEventArgs e)        {            Button btn = (Button)e.OriginalSource;            btn.ContextMenu.IsOpen = true;        }    }}

 

后记:

  动态换肤在程序里面已经基本实现,主要是资源字典的动态加载,以及背景图片的替换,在Grid.Background的ImageBrush属性里面,在点击按钮之后更换了资源字典之后还是需要手动写代码替换一下背景的

写的时候就在想能不能写成属性通知的那个样子,当它发生改变了,自动去更新,不用我手动的去写代码,但是有种无从下手的感觉。

  这段时间老是会觉得自己的知识不够,遇到问题不能从本质上去了解及解决,一定要在网上荡代码参考怎么样的,实用主义,有的时候是好,但是后期的积累问题会越来越难以解决,所以要注意夯实基础,这段时间

需要好好的看一看基础的组成什么的。感觉自己什么都很匮乏。代码写的不够优雅,自己看着都觉得凌乱,变量名不优美,看着不赏心悦目。这些都是我的目标,现在方向有了。向着我的程序员之路,fighting!

转载于:https://www.cnblogs.com/XzcBlog/archive/2012/11/08/2760546.html

你可能感兴趣的文章
hdu 1040 As Easy As A+B
查看>>
java笔记:SpringSecurity应用(二)
查看>>
php记录代码执行时间
查看>>
【C】strcpy()需谨慎使用;
查看>>
用Adobe Flash Professional CS6创建一个iOS应用程序
查看>>
简简单单几段代码让自己变成最合格的网站管理员
查看>>
Slim Text 0.0.9 发布, 代码开源!
查看>>
[置顶] 遵循Java EE标准体系的开源GIS服务平台之二:平台部署
查看>>
Session深度探索
查看>>
shell语法简单介绍
查看>>
Java递归算法——阶乘
查看>>
Multi-voltage和power gating的实现
查看>>
JavaScript面向对象 ~ 原型和继承(1)
查看>>
ubuntu下安装nginx时依赖库zlib,pcre,openssl安装方法
查看>>
spring cloud微服务分布式云架构--hystrix的使用
查看>>
解决Mac启动Eclipse Memory Analyzer报错问题
查看>>
jquery的$().each,$.each的区别
查看>>
自己写的进度条###
查看>>
实现批量添加20个用户,用户名为user1-50,密码为user后面跟5个随机字符
查看>>
Net命令详解
查看>>