WPF学习一:XAML的资源(Resources)结构

一个初学者,把知识做个积累,如果有不对的地方,还请高手指出,谢谢!

先看一段代码:(下面是以Window WPF进行讲解,如果是Web 的话就把<Window改为<Page 而如果是 UserControl 的话,就改成<UserControl ... )

<Window x:Class="brush.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  Title="Window1" Height="300" Width="300">
    <Window.Resources >
        <Style  x:Key="ButtonStype" TargetType="Button" >
            <Setter Property="BorderBrush">
                <Setter.Value>
                    <SolidColorBrush  Color="Red" Opacity="0.5" />
                </Setter.Value>
            </Setter>
            <Setter Property="Width" Value="100" />
            <Setter Property="Height" Value="100" />
        </Style>
    </Window.Resources>
    <Grid >
        <Button BorderThickness="10"  Margin="125,85,53,77"  Style="{StaticResource ButtonStype }">Clik Me</Button>
    </Grid>

</Window>

上面代码中用Window.Resources 定义一个Window级的Resources ,这只是一种以Window级的资源的定义.

其实Resources的定义可以在每一个容器控件中,(或者是在每一个控件,在Template 中可以用到),像C#中变量的定义一样,Resource的定义的地方不同

也就决定它的作用范围,如:

Window.Resources它的作用范围就是在Window容器里的所有子控件有效,也只有这些只控件才能引用/调用这些资源

Grid.Resources它的作用范围就是在Grid容器里的所有子控件有效,也只有这些只控件才能引用/调用这些资源

以此类推....

请注意:Window不是最上层的"容器",最上层的应该是Appication ,所以Application.Resources 的作用范围更大(有人把Application.Resource叫作全局资源,所有在这个Application下的容器控件等都可以使用,常用来做一个应该程序的Skin ,其ResourceDictionary定义的资源也类似 )

(<<我眼里的XAML结构框架>>概括为:"一个Application下有多个Window ,一个Window下有一个Grid,一个Grid下有很多布局容器,这些容器里面有好子容器或控件 ,控件里面有Template,template里面又可以里Grid……  ")

在我们敬爱的包包的Blog写到:"绑定后,从底层向上开始找数据源,直到发现位置为止,最上层是<Window>”  不知道是是理解的不对,还是其它的(请包老师指点一下)

我认为最上层应该是Application

<Application x:Class="brush.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Startup="MyApplication_Startup" >
    <Application.Resources>
        <LinearGradientBrush x:Key="GrayBlueGradientBrush" StartPoint="0,0" EndPoint="1,1">
            <LinearGradientBrush.GradientStops>
                <GradientStop Color="DarkGray" Offset="0" />
                <GradientStop Color="#CCCCFF" Offset="0.5" />
                <GradientStop Color="DarkGray" Offset="1" />
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
        ......

当一个控件绑定了Resources 时,它是从本身所在的容器所定义的资源往上找,直到找到,找到后就不再往上找,最上层就是Application.Resources

对于Application.Resources动态改变资源还有以下几点:

请注意绑定的时候要用DynamicResource而进绑定而不能是上面的StaticResource (这两个的区别是:StaticResource是在编译时绑定,而DynamicResource

在需要是去绑定,具体请看后面写的"XAML的标志扩展")

1,不只是在定义了<Application的xaml里可以定义Resources 还定用下面的方法来加ResourceDictionary里的资源

ResourceDictionary: Resources/myStyle.xaml

<ResourceDictionary
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  > <!-- 以下和 object.Resources的写法一样-->
  <Style TargetType="TextBlock">
    <Setter Property="FontSize" Value="12" />
  </Style>
   .....

在需要换肤的代码中写:

Uri skinDictUri = new Uri("Resources/myStyle.xaml", UriKind.Relative);
            // Tell the Application to load the skin resources.
            DemoApp app = Application.Current as DemoApp;
            app.ApplySkin(skinDictUri);

或者是这样写:

 private void ChangeSkin(object sender, ExecutedRoutedEventArgs e)
        {
            ResourceDictionary rd = new ResourceDictionary();
            rd.MergedDictionaries.Add(Application.LoadComponent
                (new Uri("Resources/myStyle.xaml", UriKind.Relative)) as ResourceDictionary);
            Application.Current.Resources = rd;
            // save the skin setting
            appSettings.Skin = e.Parameter as string;
            appSettings.Save();
        }

另外一种Resources.Add(此方法不仅可以应用到Application.Resources中,还可以应该到Window  Controls 的Resources中去) window.Resources.Add("borderBrush", new SolidColorBrush(Color.FromRgb(255, 0, 0)));

转:http://www.cnblogs.com/CsharpBlog/archive/2009/10/14/1583481.html

时间: 2024-09-29 01:11:28

WPF学习一:XAML的资源(Resources)结构的相关文章

WPF学习笔记-使用自定义资源字典(style)文件

1.添加资源字典文件style.xmal 2.在资源字典中添加自定义style等 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfTest.resources&

WPF学习------XAML 语法详述

XAML 语言规范 XAML 语言规范中也定义或引用了此处定义的 XAML 语法术语. XAML 是一种基于 XML 并遵循或扩展 XML 结构规则的语言. 其中某些术语共享自或基于描述 XML 语言或 XML 文档对象模型时常用的术语. 有关 XAML 语言规范的更多信息,请从 Microsoft 下载中心下载 [MS-XAML]. XAML 和 CLR XAML 是一种标记语言. 顾名思义,公共语言运行时 (CLR) 实现了运行时执行. XAML 本身并非 CLR 运行时直接使用的一种公共语

【WPF学习】第二十八章 程序集资源

原文:[WPF学习]第二十八章 程序集资源 WPF应用程序中的程序集资源与其他.NET应用程序中的程序集资源在本质上是相同的.基本概念是为项目添加文件,从而Visual studio可将其嵌入到编译过的应用程序的EXE或DLL文件中.WPF程序集资源与其他应用程序中的程序集资源之间的重要区别是引用他们的寻址系统不同. 在前面章节已讨论过程序集资源的工作原理.因为每次编译应用程序时,项目中的每个XAML文件都转换为解析效率更高的BAML文件.这些BAML文件作为独立资源嵌入到程序集中.添加自己的资

【WPF学习】第三十五章 资源字典

原文:[WPF学习]第三十五章 资源字典 如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/wi

WPF学习笔记(XAML)

引言 这是我来院子里第一次写文章,由于工作一年半做了一些项目,但是真的感觉会的东西太少,而且基础笔记差,最近想学习一些东西,多写些文章,激励自己坚持学习下去. 由于准备用WPF做一个项目,驱动要先学习一下XAML的知识,XAML同时可以应用于WEB应用,移动应用的开发,所以有学习的价值. 概要. 下面开始进入主题,来写一下这几天XAML学习的东西. 概要 XAML(Extensible Application Markup Language),可拓展应用程序标记语言,是一种声明式语言,目的使UI

WPF学习笔记2&mdash;&mdash;XAML之2

三.事件处理程序与代码隐藏 例如,为一个Page添加一个Button控件,并为该Button添加事件名称Button_Click: <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="ExampleNamespace.ExampleP

学习WPF——了解WPF中的XAML

XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Button对象 XAML可以在一个元素中嵌套另一个元素,例如Grid元素可以嵌套Button元素 了解XAML VisualStudio创建一个窗口,默认情况下产生的代码如下: 这段代码中包含两个标记元素,一个是Window,一个是Grid Window是WPF顶级元素的一种,还有另外两种顶级元素Page和Appl

WPF学习10:基于MVVM Light 制作图形编辑工具(1)

图形编辑器的功能如下图所示: 除了MVVM Light 框架是一个新东西之外,本文所涉及内容之前的WPF学习0-9基本都有相关介绍. 本节中,将搭建编辑器的界面,搭建MVVM Light 框架的使用环境. 界面 <Window x:Class="GraphEditor.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http:

wpf学习(二)

1.命名空间xmlns xmlns:x其只是MS的一个命名而已,没有任何特殊的意义 xmlns:local="clr-namespace:myNamespace" --每个XAML元素都是一个CLR类型,通过自定义的命名空间,可以使用命名空间里的类 xmlns:sys="clr-namespace:System;assembly=System"--通过这种方式,可以在XAML中使用几乎所有的DOTNET框架类 2.通常用的xaml元素 Root元素:Windows和