XAML - Markup-Erweiterungen
In XAML-Anwendungen sind Markup-Erweiterungen eine Methode / Technik, um einen Wert zu erhalten, der weder ein bestimmtes XAML-Objekt noch ein primitiver Typ ist. Markup-Erweiterungen können durch Öffnen und Schließen von geschweiften Klammern definiert werden. Innerhalb dieser geschweiften Klammern wird der Umfang der Markup-Erweiterung definiert.
Datenbindung und statische Ressourcen sind Markup-Erweiterungen. Es gibt einige vordefinierte XAML-Markup-Erweiterungen inSystem.xaml welches verwendet werden kann.
Schauen wir uns ein einfaches Beispiel an, in dem StaticResources Es wird eine Markup-Erweiterung verwendet, bei der es sich um eine vordefinierte XAML-Markup-Erweiterung handelt.
Der folgende XAML-Code erstellt zwei Textblöcke mit einigen Eigenschaften, deren Vordergrund in definiert ist 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>
Im Window.Resources, du kannst sehen x:Key wird verwendet, um die Elemente, die in einem XAML-definierten Wörterbuch erstellt und referenziert werden, eindeutig zu identifizieren, um eine Ressource in einem Ressourcenwörterbuch zu identifizieren.
Wenn Sie den obigen Code kompilieren und ausführen, wird das folgende MainWindow erstellt. Sie können die beiden Textblöcke mit blauer Vordergrundfarbe sehen.
In XAML können benutzerdefinierte Markup-Erweiterungen auch definiert werden, indem die MarkupExtension-Klasse geerbt und die ProvideValue-Methode überschrieben wird, die eine abstrakte Methode in der MarkupExtension-Klasse ist.
Schauen wir uns ein einfaches Beispiel für eine benutzerdefinierte Markup-Erweiterung an.
<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>
Im obigen XAML-Code wird eine Schaltfläche mit einigen Eigenschaften und für den Inhaltswert eine benutzerdefinierte Markup-Erweiterung erstellt (my:MyMarkupExtension) wurde mit zwei Werten "Markup" und "Extension" verwendet, die FirstStr bzw. SecondStr zugewiesen sind.
Tatsächlich MyMarkupExtension
handelt es sich um eine Klasse, die MarkupExtension
wie unten in der C # -Implementierung gezeigt abgeleitet ist . Diese Klasse enthält zwei Zeichenfolgenvariablen, FirstStr und SecondStr, die verkettet sind und diese Zeichenfolge von der ProvideValue-Methode an den Inhalt einer Schaltfläche zurückgeben.
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;
}
}
}
Lassen Sie uns diese Anwendung ausführen und Sie können sofort in unserem MainWindow sehen, dass "Markup-Erweiterung" erfolgreich als Inhalt der Schaltfläche verwendet wurde.