【发布时间】:2012-02-01 02:16:41
【问题描述】:
我尝试阅读有关标记扩展的 MSDN 文章,但我找不到它们是(文章讨论了它们做什么)。
我找不到为什么我们需要标记扩展的明确解释。如果我们可以直接访问控件对象,为什么我们需要标记扩展来访问绑定对象?
我们是否需要标记扩展以使 XAML 了解背后的代码(否则无法访问任何内置类)?但是我们如何才能访问所有的控件类型呢?
【问题讨论】:
我尝试阅读有关标记扩展的 MSDN 文章,但我找不到它们是(文章讨论了它们做什么)。
我找不到为什么我们需要标记扩展的明确解释。如果我们可以直接访问控件对象,为什么我们需要标记扩展来访问绑定对象?
我们是否需要标记扩展以使 XAML 了解背后的代码(否则无法访问任何内置类)?但是我们如何才能访问所有的控件类型呢?
【问题讨论】:
标记扩展不是关于访问,而是通过做任何你想做的事情来扩展标记的功能(顾名思义),比如创建关联(Binding、x:Reference)或获取类的类型(@987654324 @)。
它们几乎可以用于任何事情,只有在标记本身不够用时才需要它们。
【讨论】:
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}" />
后一种语法还提供了一种使用文本字符串以外的值的方法(即,它是一个新对象),例如我们程序集中已构造的对象或静态对象。从这个意义上说,标记扩展是决定 如何在运行时设置属性。
【讨论】:
来自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 人对象)。
【讨论】: