WPF快速指导1:资源

简介: WPF快速指导1:资源    本文摘要:    1:资源应用场景;    2:静态资源和动态资源;    3:Application.Current.Resources和Application.Current.Resources.MergedDictionaries     4:路径 一:资源的应用场景场景1:格式化界面显示元素    所谓格式化界面显示元素,就是使用统一的风格来定义软件的每个界面。

WPF快速指导1:资源
    本文摘要:
    1:资源应用场景;
    2:静态资源和动态资源;
    3:Application.Current.Resources和Application.Current.Resources.MergedDictionaries
    4:路径


一:资源的应用场景


场景1:格式化界面显示元素
    所谓格式化界面显示元素,就是使用统一的风格来定义软件的每个界面。
    要满足本需求,只需要在App.xaml中如下定义资源

<Application.Resources>
        <Style TargetType="TextBlock" x:Key="TitleText">
            <Setter Property="Background" Value="Blue"/>
            <Setter Property="FontSize" Value="12"/>
        </Style>
        <Style TargetType="TextBlock" x:Key="Label">
            <Setter Property="Background" Value="Blue"/>
            <Setter Property="FontSize" Value="12"/>
        </Style>
</Application.Resources>

 

同时,在每个页面如下引用资源即可:

    <StackPanel>
        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
        <TextBlock Style="{StaticResource Label}">Label</TextBlock>
    </StackPanel>

 

场景2:动态更新界面风格
    要动态更新界面风格,首先需要定义多种界面风格。假设有Sytle1和Style2两种风格,其中Style1在Style1.xaml中定义:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="TextBlock" x:Key="TitleText">
        <Setter Property="Background" Value="Blue"/>
        <Setter Property="FontSize" Value="12"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="Label">
        <Setter Property="Background" Value="Blue"/>
        <Setter Property="FontSize" Value="12"/>
    </Style>
</ResourceDictionary>

 

Style2在Style2.xaml中定义(假设将Style1中的Blue改为Yellow,12改为24,不再列出)。那么,在页面中,我们如下引用:

    <StackPanel>
        <TextBlock Style="{DynamicResource TitleText}">Title</TextBlock>
        <TextBlock Style="{DynamicResource Label}">Label</TextBlock>
        <Button Click="Button1_Click">Style1</Button>
        <Button Click="Button2_Click">Style2</Button>
    </StackPanel>

 

同时,后台代码为:

        ResourceDictionary style1;
        ResourceDictionary style2;
        
        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            style1 = new ResourceDictionary();
            style1.Source = new Uri(@"Resouce\Style1.xaml", UriKind.Relative);
            Application.Current.Resources = style1;
        }
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            style2 = new ResourceDictionary();
            style2.Source = new Uri(@"Resouce\Style2.xaml", UriKind.Relative);
            Application.Current.Resources = style2;
        }

 

    如此一来,我们便完成动态的界面风格变化。


二:静态资源和动态资源

    在上文的场景二示例中,如果将XAML中的

        <TextBlock Style="{DynamicResource TitleText}">Title</TextBlock>
        <TextBlock Style="{DynamicResource Label}">Label</TextBlock>

 

    换成

        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
        <TextBlock Style="{StaticResource Label}">Label</TextBlock>

 

    我们会发现界面的风格根本没有得到改变。这里我们引出静态资源和动态资源最重要的一个区别:静态资源不基于运行时行为进行重新求值,而动态资源在运行时加载。
    关于静态资源和动态资源其它区别请查看MSDN。


三:Application.Current.Resources和Application.Current.Resources.MergedDictionaries

    先来看这两个变量的原型:
    Application.Current.Resources的原型是一个ResourceDictionary。
    Application.Current.Resources.MergedDictionaries是一个Collection<ResourceDictionary> 。
    从本质上来讲,这两个变量没有区别,MergedDictionaries是在表现形式上,在运行时扩展系统的资源。
    我们再来看上文中运行时动态改变界面的示例,我们通过动态给Application.Current.Resources赋值,来改变界面风格。
    在实际使用中,必不要这么做。因为不管你是否需要在运行时动态更新部分界面风格,有些资源是肯定不变的。也就是说,一个系统,必定已经存在一个资源文件,即,最好不要在运行时改变Application.Current.Resources。那么,实际要做的,就是动态的增加或者删除Application.Current.Resources.MergedDictionaries就可以了。


四:路径

  第一种:

            imgContent.Source = new BitmapImage(new Uri("Content.jpg", UriKind.Relative)); 
            imgResource.Source = new BitmapImage(new Uri("Resource.jpg", UriKind.Relative));

 

  第二种:

            imgContent.Source = new BitmapImage(new Uri("pack://application:,,,/Content.jpg")); 
            imgResource.Source = new BitmapImage(new Uri("pack://application:,,,/Resource.jpg"));

 

  第三种:

            imgContent.Source = new BitmapImage(new Uri("pack://SiteOfOrigin:,,,/Content.jpg")); 

 

  最后一点需要说说的是路径的问题,关于路径,在WPF中有几种表示方法:

  第一种和第二种都可以访问相对WPF资源路径的Resource和Content资源。第三种方式可以访问运行目录下的Content资源文件以及完全松散的文件。完全松散的文件指那些没有添加到项目中,只是拷贝在程序目录中的文件。

  应用程序根本不知道它的存在。pack://application:,,,/Content.jpg表示当前项目的资源。它是pack://application:,,,/DllName;Component/Content.jpg的简写。将DllName替换成其他程序集,就可以访问其他程序集的资源。

  pack://SiteOfOrigin:,,,/Content.jpg表示从部署位置访问文件。

  pack URI格式是XML文件规范的一部分,具体格式如下 pack://packageURI/partPath。PackageURI实际上是在URI中放一个URI,它是把反斜杠都变成了逗号。packageURI的WPF资源路径可以志向一个XPS文档,例如file : /// c: /Document . xps会被编码为file:...c:,Document.xps。在WPF程序中有两种URI系统是特别处理的:

  siteOfOrigin:/// 编码后siteOfOrigin:,,,

  application:/// 编码后application:,,,

  3个逗号其实是反斜杠编码过来的。


该系列参考:MSDN、《WPF编程》


练习:

1:要统一整个应用程序的风格,应该如何来处理。

2:要对某个特定的页面(Window或Page)上所有的TextBlock统一风格,应该如何处理。

3:静态资源和动态资源的一个区别。

4:Application.Current.Resources和Application.Current.Resources.MergedDictionaries的用处。

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
2月前
|
C#
浅谈WPF之样式与资源
WPF通过样式,不仅可以方便的设置控件元素的展示方式,给用户呈现多样化的体验,还简化配置,避免重复设置元素的属性,以达到节约成本,提高工作效率的目的,样式也是资源的一种表现形式。本文以一个简单的小例子,简述如何设置WPF的样式以及资源的应用,仅供学习分享使用,如有不足之处,还请指正。
42 0
|
C# 数据格式 XML
WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树) 一、WPF对象级(Window对象)资源的定义与查找 实例一: StaticR...
8039 0
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
|
C#
WPF中的一个bug造成CPU资源拉满
WPF中的一个bug造成CPU资源拉满
169 0
|
C#
WPF资源字典怎么用
资源字典的使用方法
186 0
WPF资源字典怎么用
|
C# 前端开发 .NET
WPF中的资源简介、DynamicResource与StaticResource的区别
原文:WPF中的资源简介、DynamicResource与StaticResource的区别 什么叫WPF的资源(Resource)?资源是保存在可执行文件中的一种不可执行数据。在WPF的资源中,几乎可以包含图像、字符串等所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性。
1230 0
|
C#
How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?
原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behind-in-wpf 如何在WPF后台代码中中复制引用的资源? In my application, I have a color resources.
799 0
|
C# 存储
WPF中的资源(一) - 静态资源和动态资源
原文:WPF中的资源(一) - 静态资源和动态资源 WPF中,每个界面元素都含有一个名为Resources的属性,其存储的是以“键-值”对形式存在的资源,而其子级元素在使用这些资源时会从Resources中找到这些资源。
1137 0
|
C#
WPF中的资源(二) - 二进制资源
原文:WPF中的资源(二) - 二进制资源 WPF中的二进制资源,就是类似于MFC中在对话框程序中添加的图片、字符串等资源,程序在运行时将其转换成二进制,以供程序使用。
645 0
|
C#
WPF 为资源字典 添加事件响应的后台类
原文:WPF 为资源字典 添加事件响应的后台类 前言,有许多同学在写WPF程序时在资源字典里加入了其它控件,但又想写事件来控制这个控件,但是资源字典没有CS文件,不像窗体XAML还有一个后台的CS文件,怎么办呢? 在工作时也遇到了这个问题,现在把它分享出来 比如说我们现在要写一个TabControl控件,在TabItem中有一个关闭按钮或其它按钮,这个按钮要能响应某个事件。
1547 0