wpf资源Resources探究性学习(一)
测试环境:
vistual studio 2017
.net framework 3.5
window 10
新建'WPF应用(.net framework)',项目名称为:WpfDemo,如下图:
新建完项目后,默认带有一个名为MainWindow.xaml的代码
一 简单使用字符串资源
想要使用字符串,得在Window标签中引入对应的命名空间:
xmlns:s="clr-namespace:System;assembly=mscorlib",如下图:
格式为:xmlns:自己起的别名="clr-namespace:命名空间名称;assembly=程序集名称"
当某一天,我不记得要引用那个命名控件时,我们可以这样:
MainWindow.xaml.cs后台代码中,输入string,然后转到定义,就可以看到对应的dll名称和命名空间了
可以看到程序集名称为mscorlib,命名空间为System,如下图:
接着我们就可以在Button控件上通过key的方式使用资源了
上图中的StaticResource代表使用静态资源显示,也可以使用动态资源DynamicResource进行显示:
这就引出了静态资源和动态资源的区别,后面再谈
二 继承FrameworkElement类的控件都有Resources这个属性,这就意味着该控件能在控件标签内定义资源。
如:Window顶级控件,如下图:
如StackPanel控件、TextBox控件和Button控件等,基本上所有的控件都有Resources这个属性,如下图:
你注意观察一下,上图中不同控件下的资源键值key都为txt2,但都不报错,那以那个为准呢,我们大概都能猜到是从里到外进行寻找,如果在Button控件上使用key值,则会先找Button自己定义的,没找到再往上寻找StackPanel中声明的资源,如果还是没找到,则会再会往Window标签寻找。
三 定义对象作为资源
在步骤一中我们只是简单使用了一下字符串,但实际情况中类型可是多种多样的,测试步骤如下
3.1 定义一个实体类,名为Student2,并编辑如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfDemo
{
public class Student2
{
public string Name { set; get; }
}
}
然后生成项目
3.2 在前台xaml代码中引入该类对应的命名空间:
格式为:xmlns:自己起的名称="clr-namespace:本项目使用的命名空间"
由于是本项目,就不用使用本项目对应的dll名称了
在这里用到了Binding,Source指定的是静态资源stu2,Path指定要显示对应的那个属性,这里是要显示Student2的Name属性,运行程序没有任何问题。
但是,如果把静态资源修改为动态资源DynamicResource,在设计界面中使用没有任何问题,能正常显示,如下图:
但运行程序就会报如下的错误,真的好奇怪:
System.Windows.Markup.XamlParseException
HResult=0x80131501
Message=A 'DynamicResourceExtension' cannot be set on the 'Source' property of type 'Binding'. A 'DynamicResourceExtension' can only be set on a DependencyProperty of a DependencyObject.
Source=<无法计算异常源>
StackTrace:
<无法计算异常堆栈跟踪>
四 在后台代码中获取资源的值并修改资源值
可以通过this.Resources["key"]或者this.控件名称.FindResource("key")
通过非本控件的FindResource("key")也能找到对应的资源,如下图:
五 静态资源和动态资源的区别
出了点幺蛾子,还没整明白,要休息了,后续再看看