为了避免丢失和损坏,编译器允许我们把外部文件编译进程序主体、成为程序主体不可分割的一部分,这就是传统意义上的程序资源,即二进制资源;

WPF 的四个等级资源:

  1. 数据库里的数据 (仓库)
  2. 资源文件 (行旅箱)
  3. 对象资源 (背包)
  4. 变量中的数据 (手中)

1. 对象级的定义和查找

<Window.Resources>
<ResourceDictionary>
...
</ResourceDictionary>
</Window.Resources>

视情况可以简写不写。

<Window
...
xmlns:sys="clr-namespace:System;assembly=mscorlib"> <Window.Resources>
<sys:String x:Key="str">
Hello, Wpf.
</sys:String>
<sys:Double x:Key="dbl">3.1415926</sys:Double>
</Window.Resources>
<StackPanel>
<TextBlock Text="{StaticResource ResourceKey=str}"/>
</StackPanel> // C# 里面找资源,会一层一层往上找,直到 Application.Resources
string text = (string)this.FindResource("str"); //找不到就抛出异常
string text = (string)this.TryFindResource("str"); //找不到就返回 null // 如果已经明确资源放在哪,可以这样写:
string text = (string)this.Resource["str"]; //找不到就返回 null

2. 像 css 那样引用独立文件

  1. 新建独立文件 /Themes/Style.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1">
...
</ResourceDictionary>
  1. 通过 ResourceDictionary 的 Source 属性指定要引用的独立文件
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Themes/Style.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>

3. 动 or 静

StaticResource 静态资源指在程序载入内存时对资源的一次性使用,之后不再去访问这个资源;

DynamicResource 动态资源是指在程序运行过程中仍然会去访问资源;

就像主题皮肤,如果不会变的,就用 StaticResource,如果程序运行过程中还要切换不同皮肤,就使用 DynamicResource。

<Window.Resources>
<TextBlock x:Key="tb1" Text="I am a textBlock"/>
</Window.Resources>
<StackPanel>
<Button x:Name="btn1" Content="{StaticResource tb1}" />
<Button x:Name="btn2" Content="{DynamicResource tb1}" />
</StackPanel> ... void function(object sender, RoutedEventArgs e)
{
this.Resources["tb1"] = new TextBlock() { Text = "I have changed" };
}

执行 function 方法后,会看到 btn1 上的文字依旧是 "I am a textBlock", 而 btn2 按钮上的文字已变成 "I have changed"

4. 二进制资源

4.1 字符串

4.1.1 注册
  • 应用程序 Properties 名称空间中的 Resources.resx 资源文件,跟 Settings.settings 类似采用键值对的方式;
  • 为了让 XAML 编译器能够访问这个类,一定要把 Resources.resx 的访问级别由 Internal 改为 Public;
4.1.2 使用
  1. 定义举例:Properties.Resources.resx 下定义名称为 password 值为 passwd 的键值对;
  2. 调用举例:
<Window
...
xmlns:prop="clr-namespace:WpfApp1.Properties"> <StackPanel>
<TextBlock Text="{x:Static prop:Resources.username}"/>
<TextBlock x:Name="tb1"/>
</StackPanel>
</Window> this.tb1.Text = Properties.Resources.password;

4.2 媒体资源

直接将文件引入项目中;

  • 如果是想把文件编译进目标成为二进制资源,必须在窗口属性中把文件的 生成操作 属性值为 Resource,复制到输出目录 属性设为 不复制;
  • 如果想输出到生成的方案中,就把生成操作设置为 内容,复制到输出目录属性 设为 如果较新则复制,这种方式可以在生成方案之后客户端继续更换资源(如更换图片)。

4.3 使用 Pack URI 路径访问二进制资源

路径模板:

  • pack://application:,,,[/程序集名称;][可选版本号;][文件夹名称/]文件名称
  • pack://application:,,, 可以省略

    其中,程序集名称 可选版本号常使用缺省值。
<!--下面三个指定 Source 的方式效果一样-->
<Image x:Name="img1" Source="Images/2.jpg" Stretch="Fill" />
<Image x:Name="img2" Source="/Images/2.jpg" Stretch="Fill" />
<Image x:Name="img3" Source="pack://application:,,,/Images/2.png" Stretch="Fill" />

等同于下列的后台代码:

// {pack://application:,,,/WpfApp1;component/Images/2.png}
this.img1.Source = new BitmapImage(new Uri("Images/2.png", UriKind.Relative)); // {pack://application:,,,/Images/2.png}
this.img2.Source = new BitmapImage(new Uri("/Images/2.png", UriKind.Relative)); this.img3.Source = new BitmapImage(new Uri("pack://application:,,,/Images/2.png", UriKind.Absolute));

其中 pack://application:,,, 开头表示绝对路径,需使用 UriKind.Absolute;

缩略写法代表相对路径,UriKind 必须为 Relative,且代表根目录的 / 可以省略;

使用相对路径时,可以借助 DOS 的语法进行导航,如 ./ 代表上一级 ../ 代表父级

WPF 基础 - 资源的更多相关文章

  1. WPF基础学习笔记整理 (九) 资源

    基础知识: WPF的资源是一种保管一系列有用对象的简单方法,方便于重用. WPF UI元素的Resources属性,都是继承自FrameworkElement列,且其类型为ResourceDictio ...

  2. WPF基础到企业应用系列6——布局全接触

    本文转自:http://knightswarrior.blog.51cto.com/1792698/365351 一. 摘要 首先很高兴这个系列能得到大家的关注和支持,这段时间一直在研究Windows ...

  3. WPF 基础到企业应用系列索引

    转自:http://www.cnblogs.com/zenghongliang/archive/2010/07/09/1774141.html WPF 基础到企业应用系列索引 WPF 基础到企业应用系 ...

  4. (转)WPF学习资源整理

    由于笔者正在学习WPF,所以整理出网络中部分WPF的学习资源,希望对同样在学习WPF的朋友们有所帮助. 首推刘铁猛的<深入浅出WPF>系列博文 1.深入浅出WPF(1)——什么是WPFht ...

  5. WPF学习资源整理

    WPF(WindowsPresentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型 ...

  6. WPF 基础到企业应用系列5——WPF千年轮回 续前缘

    一.摘要 首先非常高兴这个系列能得到大家的关注和支持,前端时间身体状况不适,所以暂停了更新,对此表示非常抱歉,以后会逐渐加快进度.只是因为这是一个非常长的系列,我也想把它写好,所以以后也会慢慢来,在这 ...

  7. C# WPF基础巩固

    时间如流水,只能流去不流回. 学历代表你的过去,能力代表你的现在,学习能力代表你的将来. 学无止境,精益求精. 一.写作目的 做C# WPF开发,无论是工作中即将使用,还是只应付跳槽面试,开发基础是非 ...

  8. WPF之资源字典zz

    最近在看wpf相关东西,虽然有过两年的wpf方面的开发经验,但是当时开发的时候,许多东西一知半解,至今都是模模糊糊,框架基本是别人搭建,自己也就照着模板写写,现在许多东西慢慢的理解了,回顾以前的若干记 ...

  9. WPF 之 资源(Resource)

    1.什么叫WPF的资源(Resource)? 资源是保存在可执行文件中的一种不可执行数据.在WPF的资源中,几乎可以包含图像.字符串等所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性. ...

随机推荐

  1. CGI & FastCGI 协议

    目录 CGI 是什么 CGI 特点 CGI 的流程 FastCGI 是什么 CGI & FastCGI(转载) 推荐Blog: CGI是什么,FastCGI是什么 CGI 是什么 公共网关接口 ...

  2. Linux-用户/用户组身份提权

    sudo 身份提权(更安全) su命令在切换用户身份时,如果每个普通用户都能拿到root用户的密码,当其中某个用户不小心泄漏了root的密码,那系统会变得非常不安全. 为了改进这个问题,从而产生了su ...

  3. C++中的explicit

    首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数 ...

  4. 【原】无脑操作:Centos 7.6 + MariaDB + Rsyslog + LogAnalyzer环境搭建

    背景: 网络安全法第三章第二十一条明确规定"采取监测.记录网络运行状态.网络安全事件的技术措施,并按照规定留存相关的网络日志不少于六个月". 为了满足合规性的要求,应当建设相应的日 ...

  5. 翻译:《实用的Python编程》01_03_Numbers

    目录 | 上一节 (1.2 第一个程序) | 下一节 (1.4 字符串) 1.3 数字 本节讨论数学计算. 数字类型 Python 有 4 种类型的数字: 布尔型 整型 浮点型 复数(虚数) 布尔型( ...

  6. Inkscape 太慢

    问题: 在画板上图像较多时, 会在粘贴 / 删除 时会陷入长时间的等待 解决: 最佳: Ubuntu上面的比windows上的快上几十倍, 测试比较, 感觉并不是Ubuntu上多用了GPU, 总之, ...

  7. 微软收购 GitHub

    微软收购 GitHub 微软收购 GitHub震惊业界:引发开发者信任问题 https://news.cnblogs.com/n/598432/ GitLab refs xgqfrms 2012-20 ...

  8. svg & stroke & style & class

    svg & stroke & style & class svg selected style methods style class, !important fill, st ...

  9. nasm astrcat_s函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  10. 「NGK每日快讯」2021.1.5日NGK第63期官方快讯!