备注:类关系结构图如下:
事件(Event)
引入
WPF 程序中数据就分为四个等级存储:数据库里的数据相当于存放在仓库里,资源文件里的数据相当于放在旅行箱里,WPF 对象资源里的数据相当于放在随身携带的背包里,变量中的数据相当于拿在手里。
WPF 对象级资源的定义和查找
-
备注:每个 WPF 的界面元素都具有一个名为 Resource 的属性,这个属性继承自 FrameworkElement 类,其类型是 ResourceDictionary,形式是键值对的形式。
-
一个例子
备注:- 注意引入的命名空间```xmlns:sys=“clr-namespace:System;assembly=mscorlib”
- 注意第二张图片中,ResourceDictionary 和 ResourceKey 省略了,效果一样的。
- 查找顺序:先查控件自己的 Resource 属性,如果没有这个资源程序会沿着逻辑树向上一级控件查找,如果一直没有则会报异常。
- 如果资源文件放在独立文件中,也可以添加引用,代码如下:
<Window.Resource> <ResourceDictionary Source="ShinyRed.xaml" /> </Window.Resource>
静动态资源
-
引入:如果你确定某些资源在程序初始化的时候使用一次,之后不会再改变,那就用静态资源(StaticResource),因为他是程序载入内存时对资源的一次性使用,之后就不再去访问这个资源。如果程序运行过程中有可能会改变资源,那就用动态资源(DynamicResource),因为他是在程序运行过程中仍然会去访问资源。
-
一个例子
备注:- Window.Resource 中的 ResourceDictionary 的键值对中值可以是任何类型,在此处是 TextBlock 控件,同时他本质上字典,自然可以取值赋值,赋值语法和字典一样。
- 动态资源在 Button 点击之后,内容会改变,但是静态资源不会。
二进制资源
-
引入(和前面资源区别):资源字典里的资源称为WPF 资源或者 对象资源,应用程序内嵌资源称为程序集资源或者二进制资源。特别提醒一点,WPF 程序中写在
<Application.Resource> ... </Application.Resource>
标签内的资源仍然是 WPF 资源而非二进制资源。 -
添加字符串等二进制资源:
- 操作:Properties 名称空间中的 Resources.resx 资源文件双击(Resource 类) -> 访问级别由 Internal 改为 Public -> 然后手动添加键值对。
- XAML 和 C# 中调用如下:
备注:- 别忘了导入命名空间
xmlns:prop="clr-namespace.WpfApplication1.Properties"
,其中二进制资源对应的命名空间是 Properties 类是 Resources,接下就是取里面对应的字段了。 - C# 访问 Resource.resx 中的资源与使用一般别无二致。
- 使用 Resource.resx 的最大好处就是便于程序国际化、本地化,如果想改为英文,直接改资源文件就好了。
- 别忘了导入命名空间
-
添加图标、图片、音频或者视频二进制资源
- 操作:在恰当的文件夹上右击 -> Add -> Existing Item -> 选择文件 -> 属性设置(Build Action 设为 Resource, 同时 Copy to Directory 设为 Do not copy),当然如果不希望以资源的形式使用外部文件,可以设置(Build Action 为 None,同时Copy to Directory 设为 Copy always)。
- XAML 和 C# 代码如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPohgJ90-1611026507423)(./images/10_06.png )]
备注:- Pack URI 使用从右向左的正斜线表示路径
- 例子里面都是相对路径,所以 C# 代码中 UriKind 必须为 Relative,同时是可以借助 . 和 … 的。