XAML - 标记扩展

  • 简述

    在 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 类并覆盖作为 MarkupExtension 类中的抽象方法的 ProvideValue 方法来定义自定义标记扩展。
    让我们看一个自定义标记扩展的简单示例。
    
    <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),其中两个值“标记”和“扩展”分别分配给 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 中看到“标记扩展”已成功用作按钮的内容。
    标记扩展 1