XAML-マークアップ拡張機能

XAMLアプリケーションでは、マークアップ拡張機能は、特定のXAMLオブジェクトでもプリミティブ型でもない値を取得するためのメソッド/テクニックです。マークアップ拡張は、中括弧を開閉することで定義でき、その中括弧の内側で、マークアップ拡張の範囲が定義されます。

データバインディングと静的リソースはマークアップ拡張機能です。にいくつかの事前定義されたXAMLマークアップ拡張機能がありますSystem.xaml 使用できます。

簡単な例を見てみましょう。 StaticResources 事前定義されたXAMLマークアップ拡張であるマークアップ拡張が使用されます。

次のXAMLコードは、いくつかのプロパティを持つ2つのテキストブロックを作成し、それらの前景はで定義されています。 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定義ディクショナリで作成および参照される要素を一意に識別して、リソースディクショナリ内のリソースを識別するために使用されます。

上記のコードをコンパイルして実行すると、次のメインウィンドウが生成されます。前景色が青い2つのテキストブロックが表示されます。

XAMLでは、カスタムマークアップ拡張機能は、MarkupExtensionクラスを継承し、MarkupExtensionクラスの抽象メソッドであるProvideValueメソッドをオーバーライドすることによって定義することもできます。

カスタムマークアップ拡張の簡単な例を見てみましょう。

<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にそれぞれ割り当てられた2つの値「Markup」と「Extension」で使用されています。

実際にMyMarkupExtensionMarkupExtension、C#の実装で以下に示すように派生したクラスです。このクラスには、FirstStrとSecondStrの2つの文字列変数が含まれています。これらは連結され、その文字列を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; 
      } 
   }
}

このアプリケーションを実行してみましょう。メインウィンドウで、「マークアップ拡張機能」がボタンのコンテンツとして正常に使用されていることがすぐにわかります。