WPF快速指导1:资源
    本文摘要:
    1:资源应用场景;
    2:静态资源和动态资源;
    3:Application.Current.Resources和Application.Current.Resources.MergedDictionaries
    4:路径


一:资源的应用场景

场景1:格式化界面显示元素
    所谓格式化界面显示元素,就是使用统一的风格来定义软件的每个界面。
    要满足本需求,只需要在App.xaml中如下定义资源

<Application.Resources><Style TargetType="TextBlock" x:Key="TitleText"><Setter Property="Background" Value="Blue"/><Setter Property="FontSize" Value="12"/></Style><Style TargetType="TextBlock" x:Key="Label"><Setter Property="Background" Value="Blue"/><Setter Property="FontSize" Value="12"/></Style>
</Application.Resources>

同时,在每个页面如下引用资源即可:

    <StackPanel><TextBlock Style="{StaticResource TitleText}">Title</TextBlock><TextBlock Style="{StaticResource Label}">Label</TextBlock></StackPanel>

场景2:动态更新界面风格
    要动态更新界面风格,首先需要定义多种界面风格。假设有Sytle1和Style2两种风格,其中Style1在Style1.xaml中定义:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Style TargetType="TextBlock" x:Key="TitleText"><Setter Property="Background" Value="Blue"/><Setter Property="FontSize" Value="12"/></Style><Style TargetType="TextBlock" x:Key="Label"><Setter Property="Background" Value="Blue"/><Setter Property="FontSize" Value="12"/></Style>
</ResourceDictionary>

Style2在Style2.xaml中定义(假设将Style1中的Blue改为Yellow,12改为24,不再列出)。那么,在页面中,我们如下引用:

    <StackPanel><TextBlock Style="{DynamicResource TitleText}">Title</TextBlock><TextBlock Style="{DynamicResource Label}">Label</TextBlock><Button Click="Button1_Click">Style1</Button><Button Click="Button2_Click">Style2</Button></StackPanel>

同时,后台代码为:

        ResourceDictionary style1;ResourceDictionary style2;private void Button1_Click(object sender, RoutedEventArgs e){style1 = new ResourceDictionary();style1.Source = new Uri(@"Resouce\Style1.xaml", UriKind.Relative);Application.Current.Resources = style1;}private void Button2_Click(object sender, RoutedEventArgs e){style2 = new ResourceDictionary();style2.Source = new Uri(@"Resouce\Style2.xaml", UriKind.Relative);Application.Current.Resources = style2;}

如此一来,我们便完成动态的界面风格变化。


二:静态资源和动态资源

    在上文的场景二示例中,如果将XAML中的

        <TextBlock Style="{DynamicResource TitleText}">Title</TextBlock><TextBlock Style="{DynamicResource Label}">Label</TextBlock>

换成

        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock><TextBlock Style="{StaticResource Label}">Label</TextBlock>

我们会发现界面的风格根本没有得到改变。这里我们引出静态资源和动态资源最重要的一个区别:静态资源不基于运行时行为进行重新求值,而动态资源在运行时加载。
    关于静态资源和动态资源其它区别请查看MSDN。


三:Application.Current.Resources和Application.Current.Resources.MergedDictionaries

    先来看这两个变量的原型:
    Application.Current.Resources的原型是一个ResourceDictionary。
    Application.Current.Resources.MergedDictionaries是一个Collection<ResourceDictionary> 。
    从本质上来讲,这两个变量没有区别,MergedDictionaries是在表现形式上,在运行时扩展系统的资源。
    我们再来看上文中运行时动态改变界面的示例,我们通过动态给Application.Current.Resources赋值,来改变界面风格。
    在实际使用中,必不要这么做。因为不管你是否需要在运行时动态更新部分界面风格,有些资源是肯定不变的。也就是说,一个系统,必定已经存在一个资源文件,即,最好不要在运行时改变Application.Current.Resources。那么,实际要做的,就是动态的增加或者删除Application.Current.Resources.MergedDictionaries就可以了。


四:路径

  第一种:

            imgContent.Source = new BitmapImage(new Uri("Content.jpg", UriKind.Relative)); imgResource.Source = new BitmapImage(new Uri("Resource.jpg", UriKind.Relative));

  第二种:

            imgContent.Source = new BitmapImage(new Uri("pack://application:,,,/Content.jpg")); imgResource.Source = new BitmapImage(new Uri("pack://application:,,,/Resource.jpg"));

  第三种:

            imgContent.Source = new BitmapImage(new Uri("pack://SiteOfOrigin:,,,/Content.jpg")); 

  最后一点需要说说的是路径的问题,关于路径,在WPF中有几种表示方法:

  第一种和第二种都可以访问相对WPF资源路径的Resource和Content资源。第三种方式可以访问运行目录下的Content资源文件以及完全松散的文件。完全松散的文件指那些没有添加到项目中,只是拷贝在程序目录中的文件。

  应用程序根本不知道它的存在。pack://application:,,,/Content.jpg表示当前项目的资源。它是pack://application:,,,/DllName;Component/Content.jpg的简写。将DllName替换成其他程序集,就可以访问其他程序集的资源。

  pack://SiteOfOrigin:,,,/Content.jpg表示从部署位置访问文件。

  pack URI格式是XML文件规范的一部分,具体格式如下 pack://packageURI/partPath。PackageURI实际上是在URI中放一个URI,它是把反斜杠都变成了逗号。packageURI的WPF资源路径可以志向一个XPS文档,例如file : /// c: /Document . xps会被编码为file:...c:,Document.xps。在WPF程序中有两种URI系统是特别处理的:

  siteOfOrigin:/// 编码后siteOfOrigin:,,,

  application:/// 编码后application:,,,

  3个逗号其实是反斜杠编码过来的。

该系列参考:MSDN、《WPF编程》


练习:

1:要统一整个应用程序的风格,应该如何来处理。

2:要对某个特定的页面(Window或Page)上所有的TextBlock统一风格,应该如何处理。

3:静态资源和动态资源的一个区别。

4:Application.Current.Resources和Application.Current.Resources.MergedDictionaries的用处。

WPF快速指导1:资源相关推荐

  1. WPF快速指导2:模板

    WPF快速指导2:模板     本文摘要:     1:模板作用:     2:样式模板:     3:数据模板:     4:如何使用ControlTemplate:     5:如何使用DataT ...

  2. WPF快速指导5:验证

    WPF快速指导5:验证 WPF快速指导5:验证     本文摘要:     1:WPF中的验证处理机制:     2:自定义验证规则:     3:如何显示验证错误信息     4:指定何时进行验证 ...

  3. WPF快速入门系列(6)——WPF资源和样式

    WPF快速入门系列(6)--WPF资源和样式 一.引言 WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用.而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一 ...

  4. 如何快速清理docker资源

    前言 如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察觉的应该是对磁盘空间的占用.本文将介绍如何快速的清理 docker 占用的系统资源,具体点说就是删除 ...

  5. WPF整理-使用逻辑资源

    WPF整理-使用逻辑资源 原文:WPF整理-使用逻辑资源 "Traditional application resources consist of binary chunks of dat ...

  6. android 快速新建字符资源

    今天,简单讲讲如何在android studio快速新建字符资源. 把一个硬编码的字符串放到资源文件中:option + return (Windows / Linux: alt + enter).光 ...

  7. WPF中引入外部资源

    有时候需要在WPF中引入外部资源,比如图片.音频.视频等,所以这个常见的技能还是需要GET到. 第一步:在VS中创建一个WPF窗口程序 第二步:从外部引入资源,这里以引入图片资源为例 1)新建Reso ...

  8. 神的战争god无法显示服务器,神的战争god快速升级抢资源攻略

    类型:休闲益智大小:21M语言:中文 评分:10.0 标签: 立即下载 这款目前正在进行封测,大家应该也如火如荼地进行各种竞赛,抢地盘.抢资源,目标都明确的指向万神殿.不过大家都想快速变强,但怎样能够 ...

  9. 做好10种站外推广让你快速获得免费资源

    很多中小卖家在开网店的时候,没有信誉.没有资本做付费推广,因此,多花费时间去经营好以下的方式就可以让店铺快速获得免费资源,支撑起店铺转化率所需要的自然流量.这些比较简单有效的是必须要去研究学习的. 第 ...

最新文章

  1. Windows平台下程序打包流程
  2. [CVPR 2020] RandLA-Net:大场景三维点云语义分割新框架(已开源)
  3. python手机版做小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏...
  4. uva-10152-乌龟排序
  5. Git 基本工作流程
  6. 【项目管理】ITTO-相关方管理
  7. fckeditor 上传图片 php_fckeditor 上传图片乱码的解决方法_PHP教程
  8. php家检乘除,php通用检测函数集(转)_php
  9. python os模块安装方法_基于python中pygame模块的Linux下安装过程(详解)
  10. SAP License:CO07利润中心必输
  11. 关于C的函数指针总结
  12. 正确率能很好的评估分类算法吗_机器学习算法:分类知识超全总结!
  13. Android 6 ti dsp,TI DSP TMS320C66x学习笔记之内联指令(c6x.h中文注释)(六)
  14. 机器学习基础(二十)—— 数学语言与 Python 代码
  15. [转][Lucene.Net] 基本用法
  16. 全网首发:gstreamer中正确使用avdec_h264插件
  17. mysql两个库相互同步_实现两个Mysql数据库之间同步的方案
  18. bootloader 解析
  19. 风车网陈晓峰回忆录:我的两个月倒闭史
  20. 和跨域CORS有关的几个请求头和响应头请求头

热门文章

  1. Phalcon入门教程之安装
  2. 4、数据类型二:Lists
  3. public-private-protected-默认缺省 的区别
  4. 【转】Android兼容性测试CTS --环境搭建、测试执行、结果分析
  5. 【7】nagios从零学习使用 - nrpe插件使用
  6. 控制ftp访问时间段
  7. WebBrowser控件参数解释
  8. thinkphp日志泄漏漏洞_ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法...
  9. MySQL-数据类型
  10. HDFS集中式缓存管理(Centralized Cache Management)