WPF开发学习:资源在内外部定义的不同方式和怎么引用,Style样式的四种使用(对比CSS)

Web开发中,我们通过CSS来控制页面元素的样式,一般常用三种方式:

1.      内联样式表:即直接设置元素的style属性

2.      嵌入样式表:即在html页面上写一个<style>……..</style>代码段,然后设置元素的class属性

3.      外部样式表:即写一个独立的.css文件,然后再html页面上引入该文件,然后设置元素的class属性

 

具体如何操作,这里就不说了。不懂的去百度一把,绝对会出现一大坨。

 

同样的,在WP7开发中,也有类似以上几种方式设置控件的样式——开发平台可以千差万别,编程思想都是大同小异的。

 

 一,内联样式:

直接设置控件的HeightWidthForegroundHorizontalAlignmentVerticalAlignment等属性。以设置一个Botton控件的样式为例,如:

复制代码
     < Grid  x:Name ="ContentPanel"   >
             < Button  Content ="Button"  Name ="btnDemo"  
                    Height
="72"  
                    Width
="150"  
                    Foreground
="White"  
                    Background
="Blue"  
                    HorizontalAlignment
="Left"  
                    VerticalAlignment
="Top"  
                    Margin
="170,132,0,0"  
                    Grid.Row
="1"   />
          </ Grid >
复制代码

 这种方式比较简单,但是代码不能复用。

 

 二,嵌入样式:

在页面<phone:PhoneApplicationPage.Resources>节点下添加样式,然后在需要的控件上设置Style属性。还是以上面那个Botton控件为例。 

     1,在页面<phone:PhoneApplicationPage.Resources>节点下添加一个Key值叫“BtnStyle”的样式

复制代码
   < phone:PhoneApplicationPage.Resources >
         < Style  x:Key ="BtnStyle"   TargetType ="Button" >
             < Setter  Property ="Height"  Value ="72"   />
             < Setter  Property ="Width"  Value ="150"   />
             < Setter  Property ="Foreground"  Value ="White"   />
             < Setter  Property ="Background"  Value ="Blue"   />
             < Setter  Property ="HorizontalAlignment"  Value ="Left"   />
             < Setter  Property ="VerticalAlignment"  Value ="Top"   />
         </ Style >
     </ phone:PhoneApplicationPage.Resources >
复制代码
      2,  设置 Botton 控件的 Style 属性为 "{StaticResource BtnStyle}" 
    < Grid  x:Name ="ContentPanel"   >
             < Button  Content ="Button"  Name ="btnDemo"  
                   Style
=" {StaticResource BtnStyle} "
                    Margin
="170,132,0,0"    />
    </ Grid >

 

解释一下,TargetType="Button"指定了该样式适用于Botton类型的控件Key="BtnStyle"如果不设置该值,则该样式将适用于所有的Botton控件,而设置了其值为“BtnStyle,则只用于设置了 Style="{StaticResource BtnStyle}"Botton控件。这就好比CSS中的元素选择器和类选择器。


这种方式可以使得单个页面上的控件能够复用一个样式,比第一种方式面向对象了一步。 

三,外联样式:

1,新建一个.xaml资源文件,/Resources/BtnStyle.xaml

2, BtnStyle.xaml文件里编写样式代码

复制代码
BtnStyle.xaml: 
< ResourceDictionary
  
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:System
="clr-namespace:System;assembly=mscorlib" >
     < Style  x:Key ="BtnStyle"  TargetType ="Button" >
         < Setter  Property ="Height"  Value ="72"   />
         < Setter  Property ="Width"  Value ="150"   />
         < Setter  Property ="Foreground"  Value ="White"   />
         < Setter  Property ="Background"  Value ="Blue"   />
         < Setter  Property ="HorizontalAlignment"  Value ="Left"   />
         < Setter  Property ="VerticalAlignment"  Value ="Top"   />
     </ Style >
</ ResourceDictionary >
复制代码

    
    3,在App.xaml文件的<Application.Resources>

             或者普通页面的<phone:PhoneApplicationPage.Resources>

             或者用户控件的 <UserControl.Resources>  节点下

            添加相应的ResourceDictionary,配置引用BtnStyle.xaml:

复制代码
app.xaml:
     < Application.Resources > 
        
          < ResourceDictionary >
             < ResourceDictionary.MergedDictionaries >
                 < ResourceDictionary  Source ="Resources/BtnStyle.xaml" />
             <!-- <ResourceDictionary Source="Resources/BtnStyle2.xaml"/>
                <ResourceDictionary Source="Resources/BtnStyle3.xaml"/>
-->
             </ ResourceDictionary.MergedDictionaries >
         </ ResourceDictionary >
        
     </ Application.Resources >
或者MainPage.xaml:
< phone:PhoneApplicationPage.Resources >

         < ResourceDictionary >
             < ResourceDictionary.MergedDictionaries >
                 < ResourceDictionary  Source ="Resources/BtnStyle.xaml" />
             </ ResourceDictionary.MergedDictionaries >
         </ ResourceDictionary >

</ phone:PhoneApplicationPage.Resources >
复制代码

 <ResourceDictionary.MergedDictionaries>节点下可以添加多个资源文件

这种方式相比前面两种使得样式和结构又更进一步分离了。

App.xam引用,是全局的,可以使得一个样式可以在整个应用程序中能够复用。在普通页面中引用只能在当前页面上得到复用。


     4, 
设置Botton控件的Style属性为"{StaticResource BtnStyle}" 和上面的一样。

 

 四,用C#代码动态加载资源文件并设置样式

     1,新建资源文件:同上面的12两步。

    2,在后台编写代码           

复制代码
      ResourceDictionary resourceDictionary =newResourceDictionary();

     Application.LoadComponent(resourceDictionary, new Uri("/PhoneApp1;component/Resources/BtnStyle.xaml", UriKind.Relative));
     Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
     //以上几行代码表示将我们自定义的样式加载到应用程序的资源字典中。
     this.btnDemo.SetValue(Button.StyleProperty, Application.Current.Resources["BtnStyle"]);

复制代码


原文地址:http://www.cnblogs.com/xumingxiang/archive/2012/03/23/2413342.html 

 

 

 

 

 

 

 

 

关于合并资源更详细的介绍见下面

转自:http://blog.sina.com.cn/s/blog_66f3137e0100kopx.html

 1.合并多个外部资源字典成为本地字典

 

语言

XAML

示例代码

<Page.Resources>

 <ResourceDictionary>

    <ResourceDictionary.MergedDictionaries>

      <ResourceDictionary Source="myresourcedictionary1.xaml"/>

      <ResourceDictionary Source="myresourcedictionary2.xaml"/>

    </ResourceDictionary.MergedDictionaries>

 </ResourceDictionary>

</Page.Resources>

 

描述

合并多个外部资源字典成为本地字典。当需要合并更多字典的时候只要在ResourceDictionary.MergedDictionaries节中顺序增加引用。

特别提示

合并字典(MergedDictionaries 集合中的字典)中对同一对象的同一子元素进行定义的时候,会产生覆盖效果:在这种情况下,所返回的资源将来自在 MergedDictionaries 集合中最后一个找到的字典。(在这里会显示myresourcedictionary2.xaml中的定义)。

合并字典(MergedDictionaries 集合中的字典)中对同一对象的不同子元素定义的时候会产生叠加效果。

 

 

2合并多个外部资源字典到本地字典

 

 

语言

XAML

示例代码

<Page.Resources>

 <ResourceDictionary>

    <ResourceDictionary.MergedDictionaries>

      <ResourceDictionary Source="myresourcedictionary1.xaml"/>

      <ResourceDictionary Source="myresourcedictionary2.xaml"/>

</ResourceDictionary.MergedDictionaries>

<!--A Style that affects all TextBlocks-->

        <Style TargetType="">

        </Style>

        

 </ResourceDictionary>

</Page.Resources>

 

描述

合并多个外部资源字典到本地字典。当需要合并更多字典的时候只要在ResourceDictionary.MergedDictionaries节中顺序增加引用。

特别提示

合并字典(MergedDictionaries 集合中的字典)中对同一对象的同一子元素进行定义的时候,会产生覆盖效果:在这种情况下,所返回的资源将来自在 MergedDictionaries 集合中最后一个找到的字典。(在这里会显示myresourcedictionary2.xaml中的定义)。

合并字典(MergedDictionaries 集合中的字典)中对同一对象的不同子元素定义的时候会产生叠加效果。

如果资源键在主字典以及合并字典(MergedDictionaries 集合中的字典)中均进行了定义,则所返回的资源将来自主字典。这些范围规则对于静态资源引用和动态资源引用同样适用。

 

 

3.合并外部字典同时对外部字典进行扩充或替代

 

 

语言

XAML

示例代码

<Page.Resources>

 <ResourceDictionary>

    <ResourceDictionary.MergedDictionaries>

      <ResourceDictionary Source="myresourcedictionary1.xaml"/>

      <ResourceDictionary>

Source="myresourcedictionary2.xaml">

<!--A Style that affects all TextBlocks-->

        <Style TargetType="">

        </Style>

        

</ResourceDictionary>

</ResourceDictionary.MergedDictionaries>

 </ResourceDictionary>

</Page.Resources>

 

描述

合并外部字典同时对外部字典进行扩充或替代组合成本地字典。我们可以看到示例代码中红色的部分就是对外部字典myresourcedictionary2.xaml的一个扩充或者替代( 注意,这不是常见的方案,合并字典的主要方案是合并来自外部文件位置的资源。如果要在页面的标记内指定资源,则通常应当在主 ResourceDictionary(而不是合并字典)中定义这些资源。).当需要合并更多字典只要在MergedDictionaries集合中顺序增加引用。

特别提示

合并字典(MergedDictionaries 集合中的字典)中对同一对象的同一子元素进行定义的时候,会产生覆盖效果:在这种情况下,所返回的资源将来自在 MergedDictionaries 集合中最后一个找到的字典。(在这里会显示myresourcedictionary2.xaml中的定义)。

合并字典(MergedDictionaries 集合中的字典)中对同一对象的不同子元素定义的时候会产生叠加效果。

如果资源键在主字典以及合并字典(MergedDictionaries 集合中的字典)中均进行了定义,则所返回的资源将来自主字典。这些范围规则对于静态资源引用和动态资源引用同样适用。

 

 

 

4. 合并字典和代码

合并字典可以通过代码添加到 Resources 字典中。对于任何 Resources 属性存在的默认 ResourceDictionary(初始为空)还有一个默认的 MergedDictionaries 集合属性(初始为空)。若要通过代码添加合并字典,可以获取对所需的主 ResourceDictionary 的引用,获取它的 MergedDictionaries 属性值,针对包含在 MergedDictionaries 中的泛型 Collection 调用 Add。您添加的对象必须是新的 ResourceDictionary。在代码中,不需要设置 Source 属性,而必须通过创建或加载一个 ResourceDictionary 对象来获取该对象。加载现有 ResourceDictionary 的一种方法就是,针对具有 ResourceDictionary 根的现有 XAML 文件流调用 XamlReader..::.Load,然后将 XamlReader..::.Load 返回值强制转换为 ResourceDictionary。

不建议用这种方式合并外部字典,这使得外部资源文件跟硬编码偶合.

 

5. 合并资源字典 URI

可通过多种方法来包括合并资源字典,这些方法由将要使用的统一资源标识符 (URI) 格式来指示。概括地说,这些方法可以分为两类:作为项目一部分来编译的资源;不作为项目一部分来编译的资源。

对于作为项目一部分来编译的资源,可以使用引用资源位置的相对路径。相对路径是在编译过程中计算的。您的资源必须以“资源”生成操作形式定义为项目的一部分。如果您将资源的 .xaml 文件以“资源”形式包括在项目中,则不必将资源文件复制到输出目录,因为资源已经包括在所编译的应用程序中。您还可以使用“内容”生成操作,但是您必须将文件复制到输出目录,而且还必须将同一路径关系中的资源文件部署到可执行文件中。

 

注意:

不要使用“嵌入的资源”生成操作。该生成操作本身受 WPF 应用程序的支持,但是在解析 Source 时不会合并 ResourceManager,因此无法将单独的资源从流中分离出来。只要您在访问资源时使用的还是 ResourceManager,您仍可以使用“嵌入的资源”来实现其他目的。

 

一个相关方法是使用 XAML 文件的 Pack URI 并称之为“源”。Pack URI 允许引用所引用程序集和其他方法的组件。有关 Pack URI 的更多信息,请参见 Windows Presentation Foundation 应用程序资源、内容和数据文件

对于不是作为项目一部分来编译的资源,URI 是在运行时计算的。可以使用常见的 URI 传输机制(如 file: 或 http:)来引用资源文件。使用非编译资源方法的缺点在于,file: 访问机制需要额外的部署步骤,而 http: 访问机制则直接使用 Internet 安全区域。

6.重用合并字典

可以在应用程序之间重用或共享合并资源字典,因为要合并的资源字典可以通过任何有效的统一资源标识符 (URI) 来引用。您需要执行的确切操作将取决于应用程序的部署策略以及所遵循的应用程序模型。使用前面提到的 Pack URI 策略,在开发中可以通过共享程序集引用来将合并资源在多个项目之间共用。在该方案中,资源仍由客户端分发,而且至少有一个应用程序必须部署所引用的程序集。还可以通过一个使用 http 协议的分布式 URI 来引用合并资源。

将合并字典编写为本地应用程序文件或本地共享存储是另一种可能的合并字典/应用程序部署方案。

你可能感兴趣的:(style,WPF)