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")也能找到对应的资源,如下图:

五  静态资源和动态资源的区别

出了点幺蛾子,还没整明白,要休息了,后续再看看