XAML - Extensions de balisage

Dans les applications XAML, les extensions de balisage sont une méthode / technique permettant d'obtenir une valeur qui n'est ni un objet XAML spécifique ni un type primitif. Les extensions de balisage peuvent être définies en ouvrant et en fermant des accolades et à l'intérieur de ces accolades, la portée de l'extension de balisage est définie.

La liaison de données et les ressources statiques sont des extensions de balisage. Il existe des extensions de balisage XAML prédéfinies dansSystem.xaml qui peut être utilisé.

Jetons un coup d'œil à un exemple simple où StaticResources L'extension de balisage est utilisée, qui est une extension de balisage XAML prédéfinie.

Le code XAML suivant crée deux blocs de texte avec certaines propriétés et leur premier plan est défini dans 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>

Dans Window.Resources, tu peux voir x:Key est utilisé qui identifie de manière unique les éléments qui sont créés et référencés dans un dictionnaire défini XAML pour identifier une ressource dans un dictionnaire de ressources.

Lorsque vous compilez et exécutez le code ci-dessus, il produira le MainWindow suivant. Vous pouvez voir les deux blocs de texte avec une couleur de premier plan bleue.

En XAML, les extensions de balisage personnalisées peuvent également être définies en héritant de la classe MarkupExtension et en remplaçant la méthode ProvideValue, qui est une méthode abstraite dans la classe MarkupExtension.

Jetons un coup d'œil à un exemple simple d'extension de balisage personnalisé.

<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>

Dans le code XAML ci-dessus, un bouton est créé avec certaines propriétés et pour la valeur de contenu, une extension de balisage personnalisée (my:MyMarkupExtension) a été utilisé avec deux valeurs «Markup» et «Extension» qui sont attribuées respectivement à FirstStr et SecondStr.

En fait, MyMarkupExtensionest une classe dérivée de MarkupExtensioncomme indiqué ci-dessous dans l'implémentation C #. Cette classe contient deux variables de chaîne, FirstStr et SecondStr, qui sont concaténées et renvoient cette chaîne de la méthode FournirValue au contenu d'un bouton.

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; 
      } 
   }
}

Lançons cette application et vous pouvez voir immédiatement dans notre MainWindow que "l'extension de balisage" a été utilisée avec succès comme contenu du bouton.