在XAML应用程序中,标记扩展是获取既不是特定XAML对象也不是基本类型的值的方法/技术.可以通过打开和关闭花括号来定义标记扩展,并在花括号内部定义标记扩展的范围.
数据绑定和静态资源是标记扩展. System.xaml 中有一些预定义的XAML标记扩展可以使用.
让我们看一个简单的例子,其中 StaticResources 使用标记扩展,它是预定义的XAML标记扩展.
以下XAML代码创建两个具有一些属性的文本块,其前景在 Window.Resources .
<Window x:Class = "XAMLStaticResourcesMarkupExtension.MainWindow" xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" Title = "MainWindow" Height = "350" Width = "525"> <Window.Resources> <SolidColorBrush Color = "Blue" x:Key = "myBrush"></SolidColorBrush> </Window.Resources> <Grid> <StackPanel Orientation = "Vertical"> <TextBlock Foreground = "{StaticResource myBrush}" Text = "First Name" Width = "100" Margin = "10" /> <TextBlock Foreground = "{StaticResource myBrush}" Text = "Last Name" Width = "100" Margin = "10" /> </StackPanel> </Grid> </Window>
在 Window.Resources 中,您可以看到 x:Key 用于唯一标识元素在XAML定义的字典中创建和引用,以标识资源字典中的资源.
编译并执行上述代码时,它将生成以下MainWindow.你可以看到两个带蓝色前景色的文本块.
在XAML中,自定义标记扩展也可以通过继承MarkupExtension类并重写ProvideValue方法来定义,该方法是MarkupExtension类中的抽象方法.
让我们看一个简单的例子自定义标记扩展.
<Window x:Class = "XAMLMarkupExtension.MainWindow" xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my = "clr-namespace:XAMLMarkupExtension" Title = "MainWindow" Height = "350" Width = "525"> <Grid> <Button Content = "{my:MyMarkupExtension FirstStr = Markup, SecondStr = Extension}" Width = "200" Height = "20" /> </Grid> </Window>
在上面的XAML代码中,创建了一个带有一些属性的按钮,对于内容值,自定义标记扩展(my:MyMarkupExtension)已经使用了两个值"Markup"和"Extension",它们分别分配给了FirstStr和SecondStr.
实际上, MyMarkupExtension
是一个派生自 MarkupExtension
的类,如下面C#实现中所示.这个类包含两个字符串变量,FirstStr和SecondStr,它们被连接起来并将该字符串从ProvideValue方法返回到按钮的内容.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace XAMLMarkupExtension { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class MyMarkupExtension : MarkupExtension { public MyMarkupExtension() { } public String FirstStr { get; set; } public String SecondStr { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { return FirstStr + " " + SecondStr; } } }
让我们运行此应用程序,您可以立即在我们的MainWindow中看到"标记扩展"已成功用作按钮的内容.