开发者社区> 杰克.陈> 正文

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

简介: 原文:x:Static , StaticResource 和DynamicResource等XAML 扩展用法 前提:         Item ID           public static ComponentResourceKey Text_ItemIDKey ...
+关注继续查看
原文:x:Static , StaticResource 和DynamicResource等XAML 扩展用法

前提:

        <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程序了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
文件切割合并器  1 主类  SplitAnd…
文件切割合并器  1 主类  SplitAnd…
60 0
数据库访问大段文本数据  (myqsl …
数据库访问大段文本数据 myqsl + jdbc +java-io
69 0
图书管理系统代码 7GBC  网格组布…
图书管理系统代码 7GBC  网格组布…
52 0
图书管理系统代码  2 LibraryMain …
图书管理系统代码  2 LibraryMain …
49 0
图书管理系统代码 6 AboutFrame (…
图书管理系统代码 6 AboutFrame (…
75 0
图书管理系统代码  3 LibraryMainF…
图书管理系统代码  3 LibraryMainF…
61 0
图书管理系统代码  8AddBookFrame …
图书管理系统代码  8AddBookFrame …
59 0
文件切割合并器  下载地址 及 帮助
文件切割合并器  下载地址 及 帮助
58 0
文件切割合并器 6  GBC 简化
文件切割合并器 6  GBC 简化
52 0
jdbc 工具类 JdbcUtils  简化数据…
jdbc 工具类 JdbcUtils  简化数据…
79 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载