XAML: estensioni di markup

Nelle applicazioni XAML, le estensioni di markup sono un metodo / tecnica per ottenere un valore che non è né un oggetto XAML specifico né un tipo primitivo. Le estensioni di markup possono essere definite aprendo e chiudendo le parentesi graffe e all'interno di tali parentesi graffe viene definito l'ambito dell'estensione di markup.

Il data binding e le risorse statiche sono estensioni di markup. Esistono alcune estensioni di markup XAML predefinite inSystem.xaml che può essere utilizzato.

Diamo un'occhiata a un semplice esempio in cui StaticResources viene utilizzata l'estensione di markup che è un'estensione di markup XAML predefinita.

Il codice XAML seguente crea due blocchi di testo con alcune proprietà e il loro primo piano è definito in 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>

In Window.Resources, Puoi vedere x:Key viene utilizzato che identifica in modo univoco gli elementi creati e referenziati in un dizionario definito XAML per identificare una risorsa in un dizionario risorse.

Quando compili ed esegui il codice precedente, verrà prodotto il seguente MainWindow. Puoi vedere i due blocchi di testo con il colore di primo piano blu.

In XAML, le estensioni di markup personalizzate possono essere definite anche ereditando la classe MarkupExtension e sovrascrivendo il metodo ProvideValue, che è un metodo astratto nella classe MarkupExtension.

Diamo un'occhiata a un semplice esempio di estensione di markup personalizzata.

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

Nel codice XAML precedente, viene creato un pulsante con alcune proprietà e per il valore del contenuto, un'estensione di markup personalizzata (my:MyMarkupExtension) è stato utilizzato con due valori "Markup" e "Extension" assegnati rispettivamente a FirstStr e SecondStr.

In realtà, MyMarkupExtensionè una classe che deriva da MarkupExtensioncome mostrato di seguito nell'implementazione C #. Questa classe contiene due variabili stringa, FirstStr e SecondStr, che vengono concatenate e restituiscono quella stringa dal metodo ProvideValue al contenuto di un pulsante.

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

Eseguiamo questa applicazione e puoi vedere immediatamente nella nostra MainWindow che "estensione di markup" è stata utilizzata con successo come contenuto del pulsante.