Xaml-markup-extensions
XAML-マークアップ拡張機能
XAMLアプリケーションでは、マークアップ拡張機能は、特定のXAMLオブジェクトでもプリミティブ型でもない値を取得する方法/手法です。 マークアップ拡張機能は、中かっこを開いて閉じることで定義でき、その中かっこ内にマークアップ拡張機能のスコープが定義されます。
データバインディングと静的リソースはマークアップ拡張機能です。 System.xaml には、使用できる事前定義済みのXAMLマークアップ拡張機能がいくつかあります。
事前定義済みのXAMLマークアップ拡張機能である StaticResources マークアップ拡張機能が使用されている簡単な例を見てみましょう。
次の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* では、XAML定義の辞書で作成および参照される要素を一意に識別し、リソースディクショナリのリソースを識別する *x:Key* が使用されていることがわかります。
上記のコードをコンパイルして実行すると、次のMainWindowが生成されます。 青い前景色の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)*が使用され、2つの値「Markup」および「Extension」がFirstStrおよびSecondStrに割り当てられますそれぞれ。
実際、 `+ MyMarkupExtension `は、C#実装で以下に示すように ` MarkupExtension +`から派生したクラスです。 このクラスには、2つの文字列変数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;
}
}
}
このアプリケーションを実行してみましょう。すぐにメインウィンドウで「マークアップ拡張機能」がボタンのコンテンツとして正常に使用されたことを確認できます。