【问题标题】:What are XAML markup extensions?什么是 XAML 标记扩展?
【发布时间】:2012-02-01 02:16:41
【问题描述】:

我尝试阅读有关标记扩展的 MSDN 文章,但我找不到它们(文章讨论了它们做什么)。

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

我们是否需要标记扩展以使 XAML 了解背后的代码(否则无法访问任何内置类)?但是我们如何才能访问所有的控件类型呢?

【问题讨论】:

    标签: wpf xaml controls markup


    【解决方案1】:

    标记扩展不是关于访问,而是通过做任何你想做的事情来扩展标记的功能(顾名思义),比如创建关联(Bindingx:Reference)或获取类的类型(@987654324 @)。

    它们几乎可以用于任何事情,只有在标记本身不够用时才需要它们。

    【讨论】:

    • 我明白了。所以我们也可以使用元素语法编写绑定,而不是使用标记扩展?
    • @mihajlv:当然,你可以用元素语法编写每个标记扩展,通常使用大括号语法更方便。
    • @BKSpureon:这里是a MSDN article。它只是一个将另一个对象返回到使用它的属性的对象。
    【解决方案2】:

    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}" />

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

    【讨论】:

    • 让我困惑的部分是“扩展 XAML”的想法。很简单,XAML 仍然有自己的“架构”。但最终的标记扩展结果是简单的函数调用。一个很好的功能,在不同领域的基础,其中最突出的是绑定。但我觉得我不明白给出一个输入参数并获得一个返回值。如果它被称为“扩展函数 API”我现在不会这么困惑。
    • 示例 对我不起作用,它给出了一个异常“系统:环境名称不存在...”
    • 这是一个可运行的代码 sn-p 是否有意义,因为它是一个 WPF 示例?答案中的代码实际上被标记为 HTML。
    【解决方案3】:

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

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

    标记 扩展被花括号包围(例如: Background="{StaticResource NormalBackgroundBrush}")。

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

    • 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 方法。命名约定是 将单词 Extension 附加到子类的名称(仅 Binding 类不遵循模式)。

    XAML 解析器允许标记 要在 {花括号} 中创建的扩展,它还允许您 在使用标记扩展时省略扩展后缀,如果您 想要。

    示例代码:

    <!--- 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 属性。 它们都使用绑定标记 扩展 将它们的值绑定到数据上下文(a 人对象)。

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 2011-03-11
      • 2011-12-07
      • 2011-03-10
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      相关资源
      最近更新 更多