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 MarkupExtension
come 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.