• 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,并编辑如下:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Globalization;
    5. using System.Linq;
    6. using System.Text;
    7. using System.Windows.Controls;
    8. using System.Windows.Data;
    9. namespace WpfDemo
    10. {
    11. public class Student2
    12. {
    13. public string Name { set; get; }
    14. }
    15. }

    然后生成项目

    3.2  在前台xaml代码中引入该类对应的命名空间:

    格式为:xmlns:自己起的名称="clr-namespace:本项目使用的命名空间"

    由于是本项目,就不用使用本项目对应的dll名称了

    在这里用到了Binding,Source指定的是静态资源stu2,Path指定要显示对应的那个属性,这里是要显示Student2的Name属性,运行程序没有任何问题。

    但是,如果把静态资源修改为动态资源DynamicResource,在设计界面中使用没有任何问题,能正常显示,如下图:

    但运行程序就会报如下的错误,真的好奇怪:

    1. System.Windows.Markup.XamlParseException
    2. HResult=0x80131501
    3. 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.
    4. Source=<无法计算异常源>
    5. StackTrace:
    6. <无法计算异常堆栈跟踪>

    四   在后台代码中获取资源的值并修改资源值

    可以通过this.Resources["key"]或者this.控件名称.FindResource("key")

    通过非本控件的FindResource("key")也能找到对应的资源,如下图:

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

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

  • 相关阅读:
    C++ Primer Plus第五版笔记(p101-150)
    如何将docker 镜像上传到docker hub仓库
    MobPush for ReactNative
    【C++】-- STL之map和set详解
    在PostgreSQL中如何有效地批量导入大量数据,并确保数据加载过程中的性能和稳定性?
    自定义hal 接口实现流程
    新来的性能测试工程师工资25K,看了他做的性能测试,那才真叫牛
    宝刀未老!阿里P8老兵耗时三年总结出这份Java项目实战文档
    40 道基础Dubbo 面试题及答案
    万字长文总结与剖析C语言关键字 -- <<C语言深度解剖>>
  • 原文地址:https://blog.csdn.net/zxy13826134783/article/details/133100475