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