控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

WPF学习笔记5: Xaml之Markup Extensions

作者:Alen 出处:Alen 2010年09月08日 阅读:

Markup Extensions 与TypeConverter 差不多,允许扩展Xaml表达式,把Xaml中的文本转换成相应的对象/对象程序。



在上述例子中,x:Null, x:Static, Binding 都是Markup Extension.

微软已经提供了相当多的扩展,并且我们还可以自定义扩展类型。

----------------------------------------------------------------------------------------------------
微软定义的Markup Extension

所有的Extensions都必须派生于:
 


public abstract class MarkupExtension
{
public abstract object ProvideValue(IServiceProvider serviceProvider);

}

特定于 WPF 的标记扩展
WPF 编程中最常用的标记扩展是支持资源引用的标记扩展(StaticResource 和 DynamicResource)以及支持数据绑定的标记扩展 (Binding)。
1. StaticResource 通过替换已定义资源的值来为 XAML 属性提供值。
2. DynamicResource 通过将值推迟为对资源的运行时引用来为 XAML 属性提供值。动态资源引用强制在每次访问此类资源时都重新进行查找。
3. Binding 按应用于元素的数据上下文来为属性提供数据绑定值。此标记扩展相对复杂,因为它会启用大量内联语法来指定数据绑定。
4. RelativeSource 为可以在运行时元素树中定位若干可能关系的 Binding 提供源信息。对于在多用途模板中创建的绑定,或在未充分了解周围的元素树的情况下以代码创建的绑定,上述标记扩展会提供专用源。
5. TemplateBinding,控件模板可以通过它使用来自要利用该模板的类的对象模型定义属性中的模板化属性的值。有关详细信息,请参见 TemplateBinding 标记扩展。

XAML 定义的标记扩展
有几个标记扩展并非是 XAML 的 WPF 应用程序所特有的,而是属于 XAML 语言的规范和命名空间的一部分。它们通常由语法中的 x: 前缀标识,如您在常见用法中所见到的一样。这些标记扩展的 WPF 实现使用相同的 MarkupExtension 基类来提供实现。

x:Type 为命名类型提供 Type 对象。此标记扩展最常用于样式和模板。
x:Static 从不直接属于属性值类型、但可以计算为该类型的值类型代码实体中生成静态值。
x:Null 将 null 指定为 XAML 属性的值。
x:Array: 在特意不使用基元素和控件模型提供的集合支持的情况下,x:Array 为 XAML 语法中常规数组的创建提供支持。


另外还有许多,如:
x:Class
x:ClassModifier
x:Code
x:FieldModifier
x:Name
x:Shared
x:Subclass
x:TypeArguments
x:Uid
x:XData
xml:lang
xml:space


详细内容看看MSDN就好了

-------------------------------------------------------------------------------------
自定义Markup Extension
这儿我们用个实际的例子来说明如何创建和使用自定义Markup Extension:
实现一个Markup Extension,使得使用语句

<TextBox Text="{File abc.txt}"/>

可以在TextBox中显示一个文本文件的内容。

Step 1: 创建一个WPF Application工程:
Step 2:   从MarkupExtension派生一个FileExtension

namespace WpfApplication10
{
    
internal class FileExtension : MarkupExtension
    
{
        
public FileExtension()
        
{

        }

        
public FileExtension(object filePath)
        
{
            _filePath 
= filePath;
        }


        
private object _filePath;
        
/// <summary>
        
/// Must be object type.
        
/// </summary>

        public object FilePath
        
{
            
get
            
{
                
return _filePath;
            }

            
set
            
{
                _filePath 
= value;
            }

        }


        
/// <summary>
        
/// All Extension logic is implemented here.
        
/// </summary>

        public override object ProvideValue(IServiceProvider serviceProvider)
        
{
            
if (_filePath == null)
            
{
                
return string.Empty;
            }


            
try
            
{
                StreamReader sr 
= new StreamReader(_filePath as string);
                
return sr.ReadToEnd();
            }

            
catch (Exception e)
            
{
                
return e.ToString();
            }

        }

    }

}

step 3. 在 Xaml中使用FileExtension
 

<!--custom local: 前缀-->
<Window x:Class="WpfApplication10.Window1"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local
="clr-namespace:WpfApplication10"
    Title
="Window1" Height="388" Width="347">
    
<Grid>
        
<StackPanel>
            
<!--通过1个参数的构造函数创建FileExtension实例-->
            
<TextBlock Background="Bisque" Text="{local:File F:\\\test.txt}" />\
            
<!-- 1. 通过无参构造函数创建FileExtension实例
                 
2. 通过FilePath property设置文件路径-->
            
<TextBlock Background="Aqua" Text="{local:File FilePath= F:\\\test.txt}">
                
<TextBlock.LayoutTransform>
                    
<RotateTransform Angle="45"/>
                
</TextBlock.LayoutTransform>
            
</TextBlock>
        
</StackPanel>
    
</Grid>
</Window>

搞定, 看看效果 :)

WPF界面套包控件:ComponentOne Studio for WPF
中文介绍

WPF界面套包控件:RadControls for WPF
中文介绍

WPF流程图控件:AddFlow for WPF
中文介绍

更多WPF控件页面 

 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统