Учебники

XAML — Расширения разметки

В приложениях XAML расширения разметки — это метод / метод для получения значения, которое не является ни конкретным объектом XAML, ни примитивным типом. Расширения разметки могут быть определены открытием и закрытием фигурных скобок, а внутри этих фигурных скобок определяется область действия расширения разметки.

Связывание данных и статические ресурсы являются расширениями разметки. В System.xaml есть несколько предопределенных расширений разметки XAML, которые можно использовать.

Давайте рассмотрим простой пример, где используется расширение разметки StaticResources, которое является предопределенным расширением разметки XAML.

Следующий код XAML создает два текстовых блока с некоторыми свойствами, и их приоритет задается в 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> 

В Window.Resources вы можете видеть, что используется x: Key, который уникальным образом идентифицирует элементы, созданные и на которые имеются ссылки в определенном словаре XAML, для идентификации ресурса в словаре ресурсов.

Когда вы скомпилируете и выполните приведенный выше код, он создаст следующее MainWindow. Вы можете видеть два текстовых блока с синим цветом переднего плана.

Расширения разметки

В XAML пользовательские расширения разметки также могут быть определены путем наследования класса MarkupExtension и переопределения метода ProvideValue, который является абстрактным методом в классе MarkupExtension.

Давайте посмотрим на простой пример пользовательского расширения разметки.

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

В приведенном выше коде XAML создается кнопка с некоторыми свойствами, а для значения содержимого используется пользовательское расширение разметки (my: MyMarkupExtension) с двумя значениями «Разметка» и «Расширение», которые назначаются для FirstStr и SecondStr соответственно.

На самом деле MyMarkupExtension — это класс, производный от MarkupExtension как показано ниже в реализации C #. Этот класс содержит две строковые переменные, FirstStr и SecondStr, которые объединяются и возвращают эту строку из метода ProvideValue в содержимое кнопки.

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

Давайте запустим это приложение, и вы сразу увидите в нашем MainWindow, что «расширение разметки» было успешно использовано в качестве содержимого кнопки.