- XAML 教程
- XAML - 首页
- XAML - 概述
- XAML - 环境设置
- 在 macOS 上编写 XAML 应用程序
- XAML 与 C# 代码
- XAML 与 VB.NET
- XAML - 构建块
- XAML - 控件
- XAML - 布局
- XAML - 事件处理
- XAML - 数据绑定
- XAML - 标记扩展
- XAML - 依赖属性
- XAML - 资源
- XAML - 模板
- XAML - 样式
- XAML - 触发器
- XAML - 调试
- XAML - 自定义控件
- XAML 有用资源
- XAML - 快速指南
- XAML - 有用资源
- XAML - 讨论
XAML - 标记扩展
在 XAML 应用程序中,标记扩展是一种获取值的方法/技术,该值既不是特定的 XAML 对象也不是基本类型。标记扩展可以通过打开和关闭花括号来定义,在这些花括号内,定义了标记扩展的范围。
数据绑定和静态资源是标记扩展。在System.xaml中有一些预定义的XAML标记扩展可以使用。
让我们来看一个简单的示例,其中使用了预定义的 XAML 标记扩展StaticResources。
下面的 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 方法返回到按钮的 Content。
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 中立即看到“markup extension”已成功用作按钮的内容。