如果要做到一个应用程序其基本的内容不变,但改变整个应用程序的外观可以这样做:

  • 对于每一套外观定义一个ResourceDictionary
  • 在应用程序中,动态加载此应用程序(或窗体)的Resource

例如,如下的应用程序,在选择不同的用户时,显示不同的Canvas背景及图片:

主题样式A:

主题样式B:

主题样式C:

主题样式A的ResourceDictionary的XAML文件内容:

   1: <ResourceDictionary
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   4:     <!-- Canvas样式 -->
   5:     <Style TargetType="Canvas">
   6:         <Setter Property="Background">
   7:             <Setter.Value>
   8:                 <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
   9:                     <GradientStop Color="#FFFCF6F6" Offset="0"/>
  10:                     <GradientStop Color="#FF201999" Offset="1"/>
  11:                 </LinearGradientBrush>
  12:             </Setter.Value>
  13:         </Setter>
  14:     </Style>
  15: </ResourceDictionary>

样式B、样式C的XAML代码与其类似,在这里省略。

窗体应用程序的XAML及CS代码如下:

   1: <Window x:Class="StyleAndTemplete.TheMeDemo"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     Title="TheMe Demo" Height="223" Width="319" ResizeMode="NoResize" Loaded="Window_Loaded">
   5:     <Canvas>
   6:         <Image Width="150" Height="150" 
   7:                Canvas.Left="129" Canvas.Top="20"
   8:                x:Name="userImage"/>
   9:         <TextBlock Width="78" Height="20" 
  10:                    Text="Name:" TextWrapping="Wrap" 
  11:                    Canvas.Left="12" Canvas.Top="11"/>
  12:         <ComboBox Width="97" Height="27" 
  13:                   IsSynchronizedWithCurrentItem="True" 
  14:                   Canvas.Left="12" Canvas.Top="37"
  15:                   x:Name="userName" SelectionChanged="userName_SelectionChanged" />
  16:     </Canvas>
  17: </Window>
   1: using System;
   2: using System.Windows;
   3: using System.Windows.Controls;
   4: using System.Windows.Media.Imaging;
   5:  
   6: namespace StyleAndTemplete
   7: {
   8:     /// <summary>
   9:     /// Interaction logic for TheMeDemo.xaml
  10:     /// </summary>
  11:     public partial class TheMeDemo : Window
  12:     {
  13:         public TheMeDemo()
  14:         {
  15:             InitializeComponent();
  16:         }
  17:  
  18:         private void Window_Loaded(object sender, RoutedEventArgs e)
  19:         {
  20:             userName.Items.Add("Patrick");
  21:             userName.Items.Add("Abbey");
  22:             userName.Items.Add("Tobey");
  23:  
  24:             userName.SelectedIndex = 0;
  25:         }
  26:  
  27:         private void userName_SelectionChanged(object sender, SelectionChangedEventArgs e)
  28:         {
  29:             string selectedTitle = userName.SelectedItem.ToString();
  30:             string imgName = string.Format("/TitleImage/tile_{0}.png", selectedTitle);
  31:  
  32:             BitmapImage img = new BitmapImage(
  33:                 new Uri(imgName,UriKind.Relative));
  34:  
  35:             userImage.Source = img;
  36:  
  37:             string dicName = string.Format(
  38:                 "{0}Resource.xaml", selectedTitle);
  39:             
  40:             this.Resources = (ResourceDictionary)(Application.LoadComponent(
  41:                 new Uri(dicName,UriKind.Relative)));
  42:         }
  43:     }
  44: }

在微软WPF的示例程序中有一个更加复杂的示例:http://windowsclient.net/downloads/folders/wpfsamples/entry5097.aspx

文章来源:http://www.cnblogs.com/DragonInSea/archive/2009/04/28/1445354.html

[转]WPF更换主题的更多相关文章

  1. WPF实现主题更换的简单DEMO

    WPF实现主题更换的简单DEMO 实现主题更换功能主要是三个知识点: 动态资源 ( DynamicResource ) INotifyPropertyChanged 接口 界面元素与数据模型的绑定 ( ...

  2. PhpStorm 8.x/9.x 快捷键设置/个性化设置,如何多项目共存?如何更换主题?

    1."自定义"常用快捷键(设置成跟Eclipse差不多) 按照路径:File -> Settings -> Appearance & Behavior -> ...

  3. github+hexo搭建自己的博客网站(二)更换主题yilia

    开始更换主题,hexo默认的主题是landscape,可以更换为其他的主题yilia主题 详细的可以查看hexo博客的演示:saucxs.github.io 可以查看在github上生成的静态文件:h ...

  4. EasyUI实现更换主题能过样式添加id实现

    EasyUI实现更换主题能过样式添加id实现,将原来的样式值添加到cookie中保存,这样下次浏览器访问时,就是我们原来选择的样式! 首先将easyui的样式文件加入一个ID,这里命名为easyuiT ...

  5. jupyter notebook 更换主题的方法

    参考 https://github.com/dunovank/jupyter-themes install with pip # install jupyterthemes pip install j ...

  6. WordPress更换主题空白问题

    刚才尝试着更换了一个主题,后来发现预览主页的时候是一片空白.查了很多资料,有说是index.php的权限问题,有说是插件问题,有说是UTL-8编码的问题,我都试过了,发现都不行,后来仔细研究了一下,发 ...

  7. easyui更换主题之后出现validatebox的验证提示信息显示跑偏的解决方案

    在easyui中更换主题为非default的主题,有的主题会出现如下图所示的情况,验证提示信息的提示内容跑到了下面. 现在说下原因和解决方案: 原因:原因是easyui对某些主题没有进行这个样式的设置 ...

  8. Notepad++ 更换主题+字体

    Notepad++ 更换主题 https://blog.csdn.net/haluoluo211/article/details/51922666 延伸: 挑选主题 https://blog.csdn ...

  9. webstorm的安装、激活码、更换主题颜色的修改、汉化

    一.安装 1.解压webstorm11zh.rar,双击.exe文件,下一步安装,在安装结束前会提示输入激活码,这个从网上随便找一个可用的即可. 二.更换主题颜色: 1.先从网上找一个喜欢的主题颜色, ...

随机推荐

  1. npm与cnpm两者之间的区别是什么?

    NPM(节点包管理器)是节点的包管理器,用于管理节点插件(包括安装.卸载和管理依赖关系等).).NPM是一个软件包管理工具,安装在新版本的节点上,所以我们需要安装节点. NPM的常用场景(http:/ ...

  2. SQL Server SQLGetData()

    { /* 语法 C++ SQLRETURN SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT Col_or_Param_Num, SQLSMALLI ...

  3. MFC文档视图结构学习笔记

    文档/视图概述 为了统一和简化数据处理方法,Microsoft公司在MFC中提出了文档/视图结构的概念,其产品Word就是典型的文档/视图结构应用程序 MFC通过其文档类和视图类提供了大量有关数据处理 ...

  4. 5020: [THUWC 2017]在美妙的数学王国中畅游

    传送门 当年听llj讲的时候觉得这简直是个不可做的神题. 现在看来并不是很神,可能是我已经被剧透了的缘故... 一开始以为是函数套函数,懵蔽了好久,结果只是求和 被剧透了泰勒展开就比较水了..只要你不 ...

  5. scrapy运行的整个流程

    Spiders: 负责处理所有的response,从这里面分析提取数据,获取Item字段所需要的数据,并将需要跟进的URL提交给引擎,再次进入到Scheduler调度器中 Engine: 框架的核心, ...

  6. mybatis-spring多数据源配置

    mybatis-spring多数据源配置 1.注意事项:在MapperScannerConfigurer里配置的时候,每个数据源的mapper接口应放到不同的包中,下面的例子中用粗体标明,另外,对于m ...

  7. 授权指定ip访问mysql 服务器

      授权指定ip访问访问 授权ROOT使用密码1234从应用服务器主机连接到mysql服务器 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'xxx. ...

  8. JS数组 了解成员数量(数组属性length) myarr.length

    了解成员数量(数组属性length) 如果我们想知道数组的大小,只需引用数组的一个属性length.Length属性表示数组的长度,即数组中元素的个数. 语法: myarray.length; //获 ...

  9. MYSQL随笔心得1

    cmd链接数据库命令: 输入密码进入 显示全部的数据库: 退出服务器连接,还有/p   quit 非关系型数据库:NOSQL,not only sql 不仅仅是SQL 代表:redis,mongodb

  10. C++: Type conversions

    1.static_cast     static_cast可以转换相关联的类,可以从子类转换成父类.也能从父类转向子类,但是如果转换的父类指针(或者父类引用)所指向的对象是完整的,那么是没有问题:但是 ...