我尝试阅读关于标记扩展的MSDN文章,但我无法找到他们 的内容(文章讨论了他们做什么)。
我找不到为什么我们需要扩展标记的明确解释。如果我们可以直接访问控制对象,为什么我们需要一个标记扩展来访问绑定对象?
我们是否需要标记扩展,以便XAML知道后面的代码(否则无法访问任何内置类)?但那么我们如何才能访问所有控件类型呢?
答案 0 :(得分:5)
标记扩展不是关于访问,而是通过执行任何您想要的操作来扩展标记的功能(顾名思义),例如创建关联(Binding
,x: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标记 扩展,将其值绑定到数据上下文中的属性( 人员对象)。