闲话WPF之十六(WPF中的资源 [2])「建议收藏」

闲话WPF之十六(WPF中的资源 [2])

大家好,又见面了,我是全栈君。

在本系列的之十三中简单介绍了WPF中资源的资源。但是,没有给出任何具体的实例,在这个Post中将给出一个动态资源的例子,也算是响应daxian110的请求。并适当的扩展在前一个Post当中没有涉及的知识。

我们先看一个例子程序:

<Window x:Class=”WindowsApplication1.Window1″

    xmlns=”
http://schemas.microsoft.com/winfx/2006/xaml/presentation

    xmlns:x=”
http://schemas.microsoft.com/winfx/2006/xaml

    Title=”WindowsApplication1″ Height=”150″ Width=”100″ Loaded=”OnLoaded”

    >

    <Canvas>

      <Button Click=”OnClick” Canvas.Left=”10″ Canvas.Top=”20″

              Width=”80″ Height=”30″ Content=”{DynamicResource TestRes1}”/>

      <Button Canvas.Left=”10″ Canvas.Top=”60″ Width=”80″

              Height=”30″ Content=”{DynamicResource TestRes2}”/>

    </Canvas>

</Window>

程序很简单,在窗口中添加了两个按钮,我们需要关注的是其中对Content属性。这个属性的作用就是设置按钮的内容。为什么这里的名称不是Text,而是Content?如此命名的原因和WPF中控件一个非常重要的概念有关:WPF中几乎任何的控件(也就是Element)都可以作为一个容器存在。也就是说我们在Content属性中可以包含其它任何你想显示的内容。不止是字符串文本。这种抽象的处理使我们可以把所有的内容等同对待,减少了很多处理上的麻烦。在本例子中,Content属性被和一个TestRes1和TestRes2关联起来。这个TestRes到底是什么呢?这就是动态资源的名称。具体的内容在显示按钮的时候决定。

注意上面Window中的Loaded属性,通过它我们可以设置一个函数名称,它将Window加载完成后被调用。下面就看看如何用代码控制TestRes:

private void OnLoaded(object sender, RoutedEventArgs e)
{

      string szText1 = “Res Text1”;
      this.Resources.Add(“TestRes1”, szText1);

      string szText2 = “Res Text2”;
      this.Resources.Add(“TestRes2”, szText2);
}

OnLoaded是Window1类中的一个成员函数,在这个函数里,我们需要添加资源,因为我们的XAML中需要使用TestRes1和TestRes2,运行时如果找不到对应资源,程序将失败。

现在,我们调用Add方法添加资源。第一个参数是资源的名称,第二个参数是添加的资源对象。

程序的运行效果如图1:

闲话WPF之十六(WPF中的资源 [2])「建议收藏」                  闲话WPF之十六(WPF中的资源 [2])「建议收藏」
      图1                                                图2

接下来我们看看修改资源的方法。在上面XAML的第一个按钮的Click属性中我们指定了一个OnClick事件方法。它将在点击按钮时调用,现在我们通过这个事件来修改另一个按钮的Content资源:

private void OnClick(object sender, RoutedEventArgs e)
{

      string szText = “New Res Text”;
      this.Resources.Remove(“TestRes2”);
      this.Resources.Add(“TestRes2”, szText);
}

OnLoaded实现同样的简单,先调用Remove方法删除已有的TestRes2资源,然后重新添加一个新的TestRes2资源对象。点击第一个按钮后,下面按钮的文本将自动修改为新的资源对象。运行效果如图2。 

XAML加载器在分析XAML文件时,发现StaticResource,将会在当前Element的资源中查找指定的Key,如果查找失败,将沿着逻辑树向上查找,直到Root元素。如果还没有找到资源,再查找Application下定义的资源。在Application中定义的资源适用于整个应用程序。类似于全局对象。注意:使用Static资源时,不能向前引用。即使偶尔程序运行成功,向前引用的效率将非常低,因为它需要查找所有的ResourceDictionay。对于这种情况,使用DynamicResource将更适合。

另一方面,XAML加载器发现DynamicResource时,将根据当前的属性设置创建一个表达式,直到运行过程中资源需要,才根据表达式从资源中查找相关内容进行计算,返回所需的对象。注意,DynamicResource的查找于StaticResource基本类似,除了在定义了Style和Template时,会多一个查找目标。具体的细节可参数MSDN。

本文转自赖仪灵博客园博客,原文链接:http://www.cnblogs.com/YilingLai/archive/2006/12/30/608237.html,如需转载请自行联系原作者。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108116.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 很震撼的HTML5视频播放器,电影院的感觉建议收藏

    效果很震撼!有电影院的感觉了。呵呵。看了下代码,依然是在一个canvas里嵌入然后getImageData点击这里查看效果代码:varcanvas=document.createElement

    2021年12月20日
    47
  • 一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)「建议收藏」

    一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)「建议收藏」一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)PID控制应该算是应用非常广泛的控制算法了。小到控制一个元件的温度,大到控制无人机的飞行姿态和飞行速度等等,都可以使用PID控制。这里我们从原来上来理解PID控制。PID(proportionintegrationdifferentiation)其实就是指比例,积分,微分控制。先把图片和公式摆出来,看不懂没关系。(一开始看这…

    2022年5月3日
    50
  • Idea激活码最新教程2023.3.8版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2023.3.8版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2023 3 8 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2023 3 8 成功激活

    2025年5月29日
    13
  • 办公日志管理系统_crm管理系统

    办公日志管理系统_crm管理系统日志管理系统rsyslogd什么是rsyslogdrsyslogd是一个进程,是一个日志服务,我们可以通过rpm-qc查询软件包的方式来查看[root@localhost~]#rpm-qcrsyslog/etc/logrotate.d/syslog/etc/rsyslog.conf/etc/sysconfig/rsyslog查询结果会出现三个文件:/etc/…

    2022年8月15日
    9
  • linux tcp发包工具_怎么用命令行查IP

    linux tcp发包工具_怎么用命令行查IPSendip是一个linux平台的命令行发数据包工具,目前(2018年2月)支持的协议有ipv4、ipv6、icmp、tcp、udp、bgp、rip、ntp,作者表示其他协议将会后面支持,当他有空写的时候。Sendip很强大,它支持自定义头部和数据(也就是IP层以上的整个包),没有过多的限制,所以连源IP都可以随意写,而且里面也提供了一些默认的选项,可以择需而发,非常方便。又因为它是命令行的,还支…

    2025年9月19日
    5
  • PS2手柄-1「建议收藏」

    PS2手柄-1「建议收藏」相关定义Comd[2]={0x01,0x42};存储了两条指令码,分别是开始指令和请求数据指令。Data[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};数据存储数组,初始全为0。MASK[16]={PSB_SELECT,PSB_L3,PSB_R3,PSB_START,PSB_PAD_UP,PSB_PAD_RIGHT,PSB_PAD_DOWN,PSB_PAD_LEFT,PSB_L2,PSB_R2,PSB_L1,PSB_R1,PSB_GREEN,P

    2022年6月11日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号