from : http://blog.sina.com.cn/s/blog_749e42850100sahi.html

前提:

<system:String x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type res:ItemRes}, ResourceId=Text_ItemID}">Item ID</system:String>

public static ComponentResourceKey Text_ItemIDKey         {             get             {                 return new ComponentResourceKey(typeof(ItemRes), "Text_ItemID");             }         }

-----------------

1.<Label Grid.Column="0" Content="{ComponentResourceKey TypeInTargetAssembly={x:Type res:ItemRes}, ResourceId=Text_ItemID}"/>

结果:错误,显示 TargetType=CccData.Resources.ItemRes.ID=Text_ItemID

2.<Label Grid.Column="0" Content="{x:Static {ComponentResourceKey TypeInTargetAssembly={x:Type res:ItemRes}, ResourceId=Text_ItemID}}"/>

结果:Build有错误,下面相对应的关于SystemColors.ControlBrush第2个例子是可以的,x:Static的功能好是拿CLASS里(不是XAML里)的Property, Constants,Variable里的值,但本例中它是XAML里的一个资源

2.5.<Label Grid.Column="0" Content="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type res:ItemRes}, ResourceId=Text_ItemID}}"/>   结果:OK

3.<Label Grid.Column="0" Content="{StaticResource {x:Static {ComponentResourceKey TypeInTargetAssembly={x:Type res:ItemRes}, ResourceId=Text_ItemID}}}"/>   结果:Build有错误 4.<Label Grid.Column="0" Content="{StaticResource {x:Static res:ItemRes.Text_ItemIDKey}}"/>

结果:OK

5.<Label Grid.Column="0" Content="{StaticResource res:ItemRes.Text_ItemIDKey}"/>   结果:Build没有错误,但运行时有错误

6.<Label Grid.Column="0" Content="{DynamicResource res:ItemRes.Text_ItemIDKey}"/>   结果:Build没有错误,但运行时也没有错误,但拿到的是空值

7.<Label Grid.Column="0" Content="{DynamicResource {x:Static res:ItemRes.Text_ItemIDKey}}"/>

结果:OK

 其实{shared:SkinObject xxxx}和{StaticResource xxxx}应该是一样的效果。(但没测过)

=================================================================================================

用XAMLPad试验下面一组XAML的编写,你会对x:Static,StaticResource,以及XAML扩展(Markup Extensions)的嵌套用法有一个比较快的认识
0.<Rectangle Name="myRectangle" Width="120" Height="20" Fill="Blue" /> 对应的代码类似-myRectangle.Fill = Brushes.Blue; --OK
1.<Rectangle Name="myRectangle" Width="120" Height="20" Fill="SystemColors.ControlBrush" /> 对应的代码类似-myRectangle.Fill ="SystemColors.ControlBrush" ; --错误, 变成一个字符串,这显然不是你想要的
2.<Rectangle Name="myRectangle" Width="120" Height="20" Fill="{x:Static SystemColors.ControlBrush}" /> 对应的代码类似-myRectangle.Fill =SystemColors.ControlBrush ; --OK
3.<Rectangle Name="myRectangle" Width="120" Height="20" Fill="{StaticResource {x:Static SystemColors.ControlBrush}}" /> 对应的代码类似-myRectangle.Fill =(Brush) myRectangle.FindResource("{#XXXXXX}" ) --错误 ,#XXXXXX 表示你系统当前ControlBrush的颜色
4.<Rectangle Name="myRectangle" Width="120" Height="20" Fill="{StaticResource {x:Static SystemColors.ControlBrushKey}}" /> 对应的代码类似 - myRectangle.Fill =(Brush) myRectangle.FindResource(SystemColors.ControlBrushKey) -OK
5.<Rectangle Name="myRectangle" Width="120" Height="20" Fill="{StaticResource SystemColors.ControlBrushKey}" /> 对应的代码类似 - myRectangle.Fill =(Brush) myRectangle.FindResource("SystemColors.ControlBrushKey") -错误
6.<Rectangle Name="myRectangle" Width="120" Height="20" Fill="{DynamicResource SystemColors.ControlBrushKey}" /> 对应的代码类似 - myRectangle.SetResourceReference(Rectangle.Fill, "SystemColors.ControlBrushKey" ) --错误,但不会报错
7.<Rectangle Name="myRectangle" Width="120" Height="20" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" /> 对应的代码类似 - myRectangle.SetResourceReference(Rectangle.Fill, SystemColors.ControlBrushKey ) --OK
x:Static--应用于XAML元素的属性语法中,标识其是一个XAML的扩展,其引用的是一个.NET 中静态的值类型。可以说一般是一个枚举的值,或是一个类的静态属性,比如系统颜色类( SystemColors)中的一种颜色。 StaticResourceDynamicResource 也都是XAML的一个扩展 两者的区别是DynamicResource 所标识的资源引用会被WPF跟踪,当资源发生变化时,WPF也会自动进行变化(最简单的理解是,屏幕或窗口的颜色,在控制面板中被修改后,如果你应用的是屏幕的颜色,那么WPF也会修改该元素的颜色和属性)。StaticResource 则相对于引用资源一个快照,资源发生变化时,不会自动进行变化。DynamicResource 会比StaticResource 花费多一些的性能,而且不是所有的WPF元素都适合DynamicResource 1. A property/attribute on a FrameworkElement/FrameworkContentElement, which is backed by a DependencyProperty. 2. A value within a Style Setter. 3. A property/attribute on a Freezable, which is provided as a value of either a FrameworkElement/FrameworkContentElement property or a Setter value.
x:Type 也是XAML的一个扩展,最经典的是用在一个Style的TargetType 属性中,这个场景下它相对于一个 typeof() 的操作 例如: <Style TargetType="{x:Type Button}" >
编译时刻 TypeExtension te = new TypeExtension("Button") ; object val = te.ProvideValue( s, Style.TargetTypeProperty) ; //(Object targetObject,Object targetProperty)
运行时刻 Style s = new Style() ; s.TargetType = new typeof( Button) ;
SDK文档上说,x:Type也可以使用在一个属性-元素(property-element )的语法中,但这种情况下TypeName 必须指定,而且一般TypeName是作为x:Type 的一个属性,类似这样的语法<x:Type TypeName="typeName"/>,这个知道一下就行,最多的用法是在 Style的TargetType中,Feb CTP的版本,也有这样的用法<DataTemplate DataType="{x:Type src:AuctionItem}" >
x:Type 的两种语法定义: <Element ... Attribute="{x:Type typeName}" .../> <x:Type TypeName="typeName"/>
XAML中的扩展,都是以{}为标识的,更多的一下XAML扩展可以参考下面的文档,当你搞清楚了这些扩展之后,就能非常容易地看懂别人的XAML程序了。

About {DynamicResource {x:Static SystemColors.ControlBrushKey}}的更多相关文章

  1. x:Static , StaticResource 和DynamicResource等XAML 扩展用法

    原文:x:Static , StaticResource 和DynamicResource等XAML 扩展用法 前提: <system:String x:Key="{Component ...

  2. WPF 自定义列表筛选 自定义TreeView模板 自定义ListBox模板

    有很多项目,都有数据筛选的操作.下面提供一个案例,给大家做参考. 左侧是数据源,搜索框加TreeView控件,右侧是ListBox控件.在左侧数据列点击添加数据,然后点击确定,得到所筛选的数据. 下面 ...

  3. WPF CheckBox样式 ScrollViewer样式 WrapPanel、StackPanel、Grid布局

    本节讲述布局,顺带加点样式给大家看看~单纯学布局,肯定是枯燥的~哈哈 那如上界面,该如何设计呢? 1.一些布局元素经常用到.Grid StackPanel Canvas WrapPanel等.如上这种 ...

  4. WPF TextBox 搜索框 自定义

    更多资源:http://denghejun.github.io <Style x:Key="SearchTextBoxStyle" BasedOn="{x:Null ...

  5. WPF,Silverlight与XAML读书笔记第四十六 - 外观效果之三皮肤与主题

    说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 皮肤 皮肤是应用程序中样式与模板的集合,可以 ...

  6. WPF ItemsControl ListBox ListView比较

    在进行列表信息展示时,WPF中提供多种列表可供选择.这篇博客将对WPF ItemsControl, ListBox, ListView进行比较. 相同点: 1. 这三个控件都是列表型控件,可以进行列表 ...

  7. waterMarkTextBox

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...

  8. WPF之TreeList的实现方法(一)

    做项目的时候根据需求,WPF现有的控件不能完全满足我们的需求, 很多时候我们需要对现有的控件做一下加工. 最简单的我们可能会把Tree转换成List形式有的叫Grid形式就像下图一样 今天我先做一个完 ...

  9. WPF:xmal 静动态资源

    <StackPanel.Resources> <SolidColorBrush x:Key="myBrush" Color="Teal"/&g ...

随机推荐

  1. 用node-inspector调试NodeJS

    任何一门完备的语言技术栈都少不了健壮的调试工具,对于NodeJS平台同样如此,笔者研究了几种调试NodeJS代码的方式,通过对比,还是觉得node-inspector的调试方式比较方便,而且和前端Ja ...

  2. C++ 11 std::function std::bind使用

    cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNorm ...

  3. C++Primer 4th edition读书笔记-第二章

    1 变量的定义用于为变量分配存储空间,还可以为变量指定初始值.在一个程序中,变量有且只有一个定义.声明用于向程序表明变量的名字和类型.定义也是声明:当定义变量时,我们声明了它的类型和名字.可以通过使用 ...

  4. 字符设备驱动笔记——poll机制分析(七)

    poll机制分析 所有的系统调用,基于都可以在它的名字前加上“sys_”前缀,这就是它在内核中对应的函数.比如系统调用open.read.write.poll,与之对应的内核函数为:sys_open. ...

  5. js事件委托及其原理

    1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这 ...

  6. taglib的uri问题

    最开始我在代码中看到这样的代码(运行正常): <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/fu ...

  7. jquery input切换编辑和不可编辑模式,input自动获得焦点,遍历所有的子类标签

    input切换编辑和不可编辑模式 在项目中我们经常会用到这样的效果,点击一下不可编辑的input 标签,变成可编辑的input标签.用法如下 <input type="text&quo ...

  8. asp.net显示用户信息

    web.config <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应 ...

  9. JAVA面试题集---数据库方面_

    1.存储过程和函数的区别存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表. ...

  10. java虚拟机和Dalvik虚拟机

    java虚拟机和Dalvik虚拟机的区别: java虚拟机Dalvik虚拟机 java虚拟机基于栈. 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多dalvik虚拟机是基于寄存器的 j ...