📜  XAML-标记扩展

📅  最后修改于: 2020-11-18 10:33:01             🧑  作者: Mango


在XAML应用程序中,标记扩展是一种获取既不是特定XAML对象也不是原始类型的值的方法/技术。可以通过打开和关闭花括号来定义标记扩展名,并在该花括号内定义标记扩展名的范围。

数据绑定和静态资源是标记扩展。在System.xaml中有一些预定义的XAML标记扩展可以使用。

让我们看一个简单的示例,其中使用了StaticResources标记扩展,它是预定义的XAML标记扩展。

以下XAML代码创建具有某些属性的两个文本块,并且它们的前景在Window.Resources中定义。

 
    
    
       
    
    
    
       
          
          
       
    
    
 

Window.Resources中,可以看到x:Key用于唯一地标识在XAML定义的字典中创建和引用的元素,以标识资源字典中的资源。

当您编译并执行上述代码时,它将产生以下MainWindow。您可以看到两个带有蓝色前景色的文本块。

标记扩展

在XAML中,还可以通过继承MarkupExtension类并覆盖ProvideValue方法(它是MarkupExtension类中的抽象方法)来定义自定义标记扩展。

让我们看一个自定义标记扩展的简单示例。

 
    
    
       
    
    

在上面的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 { 
   ///  
      /// Interaction logic for MainWindow.xaml 
   ///  
    
   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