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.

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, MyMarkupExtensiones una clase que se deriva de MarkupExtensioncomo 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.