XAML: extensiones de marcado
En las aplicaciones XAML, las extensiones de marcado son un método o una técnica para obtener un valor que no es un objeto XAML específico ni un tipo primitivo. Las extensiones de marcado se pueden definir abriendo y cerrando llaves y, dentro de esas llaves, se define el alcance de la extensión de marcado.
El enlace de datos y los recursos estáticos son extensiones de marcado. Hay algunas extensiones de marcado XAML predefinidas enSystem.xaml que se puede utilizar.
Echemos un vistazo a un ejemplo simple donde StaticResources Se usa la extensión de marcado, que es una extensión de marcado XAML predefinida.
El siguiente código XAML crea dos bloques de texto con algunas propiedades y su primer plano se define en 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>
En Window.Resources, puedes ver x:Key se utiliza, que identifica de forma única los elementos que se crean y se hace referencia en un diccionario definido XAML para identificar un recurso en un diccionario de recursos.
Cuando compile y ejecute el código anterior, producirá la siguiente ventana principal. Puede ver los dos bloques de texto con el color de primer plano azul.
![](https://assets.edu.lat/xaml/images/markup_extensions.jpg)
En XAML, las extensiones de marcado personalizadas también se pueden definir heredando la clase MarkupExtension y anulando el método ProvideValue, que es un método abstracto en la clase MarkupExtension.
Echemos un vistazo a un ejemplo simple de extensión de marcado personalizado.
<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>
En el código XAML anterior, se crea un botón con algunas propiedades y para el valor de contenido, una extensión de marcado personalizada (my:MyMarkupExtension) se ha utilizado con dos valores "Markup" y "Extension" que se asignan a FirstStr y SecondStr respectivamente.
En realidad, MyMarkupExtension
es una clase que se deriva de MarkupExtension
como se muestra a continuación en la implementación de C #. Esta clase contiene dos variables de cadena, FirstStr y SecondStr, que se concatenan y devuelven esa cadena del método ProvideValue al contenido de un botón.
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;
}
}
}
Ejecutemos esta aplicación y podrá ver inmediatamente en nuestra ventana principal que la "extensión de marcado" se ha utilizado con éxito como contenido del botón.
![](https://assets.edu.lat/xaml/images/markup_extensions1.jpg)