什么是XAML标记扩展?

时间:2012-01-02 21:28:37

标签: wpf xaml controls markup

我尝试阅读关于标记扩展的MSDN文章,但我无法找到他们 的内容(文章讨论了他们做什么)。

我找不到为什么我们需要扩展标记的明确解释。如果我们可以直接访问控制对象,为什么我们需要一个标记扩展来访问绑定对象?

我们是否需要标记扩展,以便XAML知道后面的代码(否则无法访问任何内置类)?但那么我们如何才能访问所有控件类型呢?

3 个答案:

答案 0 :(得分:5)

标记扩展不是关于访问,而是通过执行任何您想要的操作来扩展标记的功能(顾名思义),例如创建关联(Bindingx:Reference)或获取类型class(x:Type)。

它们几乎可以用于任何事情,它们只在标记不能满足的情况下才有用。

答案 1 :(得分:1)

Rationale for markup extensions:

  

XAML很简单,这是一件好事。它只是一个基于XML的   用于声明对象及其之间关系的语言。   简单的一个副作用是它可能是冗长的。 :此   繁琐冗长是其概念的主要原因之一   引入了标记扩展。可以使用标记扩展   把许多XAML行变成一个简洁的表达式......

     

XAML的简单性的另一个副作用是它没有任何副作用   “内置”WPF或CLR使用的常见工件的知识;这样   作为资源引用,数据绑定,空值,数组,静态   一个类的成员等。因为XAML可以是一个组成部分   应用程序开发需要为开发人员提供一些方法   在其中表达这些想法。

<TextBox >
  <TextBox.Text>A text in TextBox</TextBox.Text>
</TextBox>

<TextBox Text="{x:Static system:Environment.UserName}" />

后一种语法还提供了一种方法来使用除文字字符串之外的值(即,它是一个新对象),例如已经构造的对象或我们程序集中的静态对象。在这个意义上,标记扩展是决定的对象 如何在运行时设置属性。

答案 2 :(得分:0)

来自https://wpftutorial.net/XAML.html

  

标记扩展名是属性值的动态占位符   XAML。它们在运行时解析属性的值。

     

标记   扩展名用大括号括起来(例如:   Background="{StaticResource NormalBackgroundBrush}")。

     

WPF有一些   内置的标记扩展名,但是您可以通过派生自己的标记扩展名   来自MarkupExtension。这些是内置的标记扩展:

     
      
  • Binding

         

    将两个属性的值绑定在一起。

  •   
  • StaticResource

         

    一次查找资源条目

  •   
  • DynamicResource

         

    自动更新资源条目的查找

  •   
  • TemplateBinding

         

    要将控件模板的属性绑定到的依赖项属性   控件

  •   
  • x:Static

         

    解析静态属性的值。

  •   
  • x:Null

         

    返回空值

  •   
     

一对大括号内的第一个标识符是扩展名。所有优先标识符都在   属性=值的形式。以下示例显示了一个标签,该标签的   内容绑定到文本框的文本。当您输入文字时   文本框,文本属性更改和绑定标记   扩展程序会自动更新标签的内容。

     
<TextBox x:Name="textBox"/>
<Label Content="{Binding Text, ElementName=textBox}"/>
  

关于what a markup extension is composed of

  

所有标记扩展都源自抽象的MarkupExtension类   并覆盖其ProvideValue方法。命名约定是   在子类的名称后面附加扩展名一词(仅绑定   类不遵循该模式)。

     

XAML解析器允许标记   在{curly braces}中创建扩展名,它还允许您   如果使用标记扩展名,则省略扩展名后缀   想。

示例代码:

<!--- Configure a binding markup extension via the special curly brace syntax --->
<TextBox Text="{Binding Path=Name}" Width="120"/>

<!--- Configure a binding markup extension via the standard element syntax --->
<Checkbox Content="Is person alive?">
    <Checkbox.IsChecked>
        <Binding Path="IsAlive"/>
    </Checkbox.IsChecked>
</Checkbox>
  

在上面的XAML中,查看TextBox的Text属性,然后   CheckBox的IsChecked属性。 它们都使用Binding标记   扩展,将其值绑定到数据上下文中的属性(   人员对象)。