1.什么是标记扩展?为什么要有标记扩展?

标记扩展是扩展xmal的表达能力

为了克服现存的类型转换机制存在的

常用的标记扩展有如下:

x:Array 代表一个.net数组,它的子元素都是数组元素.它必须和x:Type一起使用,用于定义数组类型

x:null 表示空引用

x:static 在过程式代码中定义的任何一个静态属性、常量和枚举

x:type 表示system.Type的一个实例,就像C#中的typeof

注:标记扩展是有Extension的,可以省略不写

标记扩展的语法是 Attribute={} 是花括号

1.staticExtension

<StackPanel Background="{x:Static Brushes.AliceBlue}" />

2.ArrayExtension StaticResourceExtension

<Window.Resources>
        <x:ArrayExtension x:Key="listitemboxs" Type="TextBlock">
            <TextBlock Text=" one"></TextBlock>
            <TextBlock Text=" two"></TextBlock>
            <TextBlock Text=" three"></TextBlock>
        </x:ArrayExtension>
</Window.Resources>
<StackPanel>
         <ListBox ItemsSource="{StaticResourceExtension listitemboxs}"></ListBox>
</StackPanel>

<Window x:Class="WpfApplication1.Window3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="Window3" Height="300" Width="300" WindowStartupLocation="CenterScreen">    
    <Window.Resources>
        <sys:String x:Key="stringHell0">Hello WPF</sys:String>
    </Window.Resources>
    <Grid>
        <TextBlock Height="24" Width="100" Text="{StaticResource ResourceKey=stringHell0}"></TextBlock>
    </Grid>
</Window>

3.NullExtension

<StackPanel Background="{x:NullExtension}"/>

4.标记扩展有2种使用方式

<StackPanel Background="{x:NullExtension}"/>

<StackPanel>
        <StackPanel.Background>
            <x:Static Member="Brushes.AliceBlue"></x:Static>
        </StackPanel.Background>
 </StackPanel>

以上两种方式显示得到一样的效果,但他们的内部实现机制是不一样的

第一种:

  1. StaticExtension staticExtension = new StaticExtension("Brushes.AliceBlue");
  2. StackPanel stackPanel = new StackPanel();
  3. stackPanel.Background = staticExtension.ProvideValue(serviceProvider) as Brush;
  4. AddChild(stackPanel);

第二种:

  1. StaticExtension staticExtension = new StaticExtension();
  2. staticExtension.Member = "Brushes.AliceBlue";
  3. StackPanel stackPanel = new StackPanel();
  4. stackPanel.Background = staticExtension.ProvideValue(serviceProvider) as Brush;
  5. AddChild(stackPanel);

这两种使用方式是一样的。但它们的内部实现机制却不同,Xaml解析器解析成的伪代码分别为:

第一种:

  1. StaticExtension staticExtension = new StaticExtension("Brushes.AliceBlue");
  2. StackPanel stackPanel = new StackPanel();
  3. stackPanel.Background = staticExtension.ProvideValue(serviceProvider) as Brush;
  4. AddChild(stackPanel);

第二种:

  1. StaticExtension staticExtension = new StaticExtension();
  2. staticExtension.Member = "Brushes.AliceBlue";
  3. StackPanel stackPanel = new StackPanel();
  4. stackPanel.Background = staticExtension.ProvideValue(serviceProvider) as Brush;
  5. AddChild(stackPanel);

实战 :拖动slider,textblock里的值变化

<Grid Margin="4">
        <Grid.RowDefinitions>
            <RowDefinition Height="24"></RowDefinition>
            <RowDefinition Height="4"></RowDefinition>
            <RowDefinition Height="24"></RowDefinition>
        </Grid.RowDefinitions>总共有3行row
        <TextBlock x:Name="tb" Background="White" Text="{Binding ElementName=sid,Path=Value}"></TextBlock>
        <Slider Name="sid" Grid.Row="2" Value="50" Maximum="100" Minimum="0"></Slider>这里的Grid.Rows是指显示在Grid里的第2行
    </Grid>

注:绿色表示没看明白,日后要修改注的

2.6 wpf标记扩展的更多相关文章

  1. [No000012C]WPF(4/7)类型转换器和标记扩展[译]

    介绍 之前讨论了WPF的基础架构,然后逐步开始学习布局面板,转换,介绍了不同的控件,容器,UI转换等.在这篇文章中,我将讨论每个创建XAML应用前的开发人员应该了解的关于XAML最重要的东西. 标记扩 ...

  2. [No0000130]WPF 4.5使用标记扩展订阅事件

    自从我上次写到关于标记扩展的时候已经有一段时间了...... Visual Studio 11 Developer Preview的发布给WPF带来了一些新功能,让我有理由再次使用它们.我要在这里讨论 ...

  3. WPF,Silverlight与XAML读书笔记(3) - 标记扩展

    hystar的.Net世界 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 103  文章- 0  评论- 107  WPF,Silverlight与XAML读书笔记(3) - 标记扩展   说 ...

  4. wpf中xaml的类型转换器与标记扩展

    原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是可以由xaml组成的,所以标签的便利也需 ...

  5. 标记扩展和 WPF XAML

      本主题介绍 XAML 的标记扩展概念,包括其语法规则.用途以及底层的类对象模型. 标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能. 本主题专门详细论述了用于 WPF X ...

  6. WPF:实现自定义标记扩展

    标记扩展使用{标记扩展类 参数}语法,如: <TextBlock Text={x:Null}/> 为什么x:Null就可以返回一个null值呢? 其实在System.Windows.Mar ...

  7. XAML语法及标记扩展、附加属性、特定的字符和空白

    1.对象元素语法 使用开闭标签将对象定义一个XML元素,这种语法与其他标记语言如HTML的元素语法非常相似,在以左右尖括号保卫要设置的类或结构的类型名称.对象元素可以声明0个或多个属性,以一个或多个空 ...

  8. XAML 属性元素,标记扩展和注释

    这节来讲一下XAML中的属性元素,标记扩展,和注释. 属性元素 一般的,我们想要对一个标签的属性赋值,可以直接在标签内部键入属性名给其赋值,如我们给button的Content属性赋值: <Bu ...

  9. XAML(4) - 标记扩展

    在为元素设置值时, 可以直接设置值, 但有时标记扩展非常有帮助.标记扩展包含花括号,其后是定义了标记扩展类型的字符串标志. 下面是一个Static Resource标记扩展: <Button N ...

随机推荐

  1. Spring 实现 IoC

    理解 “ 控制反转(IoC)”   控制反转(IoC):用白话来讲,就是由 Spring 容器控制程序中类与类之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓 “控制反转” 的概念所在:控 ...

  2. python3.x Day5 异常处理

    异常处理: 预计可能会发生的异常,明确如果发生,如何处理,不过一般不参与业务逻辑,也不要一次性捕捉全部异常,不然可能程序就不可控了. data={} mmm=[] try: #捕获异常, data[& ...

  3. Quartz --Scheduler

  4. LeetCode(53) Maximum Subarray

    题目 Find the contiguous subarray within an array (containing at least one number) which has the large ...

  5. cadence中画焊盘注意事项

    贴片焊盘的层面剖析图如下: 其中Paste Mask Top层用于制作钢网,可以做成与Top层相同的大小.阻焊层一般比顶层大0.1mm(方形焊盘的长,宽,圆形焊盘的直径). 助焊层与阻焊层区别 两个层 ...

  6. Linux虚拟机安装学习笔记

    一.Linux系统的安装1.VMwaer虚拟机的安装使用 官方下载软件地址:www.vmwaer.com 安装的虚拟机可以与现实的计算机进行通信 安装虚拟主机可以随意定制硬件安装配置建议: CPU:1 ...

  7. 游走(bzoj 3143)

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...

  8. [HDU5709]Claris Loves Painting(动态开点线段树+合并)

    题意:有n(<=1e5)个点的树,每个点都有颜色(颜色可能重复),有m(<=1e5)个询问,每次询问(x,d)问在x的子树中,与x的距离不超过d的节点有多少种不同的颜色.强制要求在线. 分 ...

  9. hdu3756(三分)

    题意:三维坐标轴,有以原点为圆心,底面在xoy平面上,顶点在z轴上的圆锥,问圆锥的最小体积为多少才能完全覆盖空间里的所有点(n<=10000) 分析: 很容易想到转成二维问题,将其投影到xoz平 ...

  10. Ubuntu 16.04设置rc.local开机启动命令/脚本的方法(通过update-rc.d管理Ubuntu开机启动程序/服务)

    注意:rc.local脚本里面启动的用户默认为root权限. 一.rc.local脚本 rc.local脚本是一个Ubuntu开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令.该脚本位于/et ...