XAML - extensões de marcação

Em aplicativos XAML, as extensões de marcação são um método / técnica para obter um valor que não é um objeto XAML específico nem um tipo primitivo. As extensões de marcação podem ser definidas abrindo e fechando chaves e dentro dessas chaves, o escopo da extensão de marcação é definido.

A vinculação de dados e os recursos estáticos são extensões de marcação. Existem algumas extensões de marcação XAML predefinidas emSystem.xaml que pode ser usado.

Vamos dar uma olhada em um exemplo simples onde StaticResources A extensão de marcação é usada, que é uma extensão de marcação XAML predefinida.

O código XAML a seguir cria dois blocos de texto com algumas propriedades e seu primeiro plano é definido em 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>

Dentro Window.Resources, você pode ver x:Key é usado para identificar exclusivamente os elementos que são criados e referenciados em um dicionário definido em XAML para identificar um recurso em um dicionário de recursos.

Quando você compila e executa o código acima, ele produzirá a seguinte MainWindow. Você pode ver os dois blocos de texto com a cor azul do primeiro plano.

Em XAML, as extensões de marcação personalizadas também podem ser definidas herdando a classe MarkupExtension e substituindo o método ProvideValue, que é um método abstrato na classe MarkupExtension.

Vamos dar uma olhada em um exemplo simples de extensão de marcação customizada.

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

No código XAML acima, um botão é criado com algumas propriedades e para o valor do conteúdo, uma extensão de marcação personalizada (my:MyMarkupExtension) foi usado com dois valores “Markup” e “Extension” que são atribuídos a FirstStr e SecondStr respectivamente.

Na verdade, MyMarkupExtensioné uma classe que é derivada MarkupExtensionconforme mostrado abaixo na implementação do C #. Esta classe contém duas variáveis ​​de string, FirstStr e SecondStr, que são concatenadas e retornam essa string do método ProvideValue para o Conteúdo de um botão.

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

Vamos executar este aplicativo e você pode ver imediatamente em nossa MainWindow que a "extensão de marcação" foi usada com sucesso como o conteúdo do botão.