WPF の XAML の概要XAML overview in WPF

この記事では、XAML 言語の機能について説明し、XAML を使用して Windows Presentation Foundation (WPF) アプリを作成する方法を示します。This article describes the features of the XAML language and demonstrates how you can use XAML to write Windows Presentation Foundation (WPF) apps. この記事では特に、WPF によって実装される XAML について説明します。This article specifically describes XAML as implemented by WPF. XAML 自体は、WPF よりも包括的な言語の概念です。XAML itself is a larger language concept than WPF.

重要

デスクトップ ガイド ドキュメントは作成中です。The Desktop Guide documentation is under construction.

XAML とはWhat is XAML

XAML は宣言型マークアップ言語です。XAML is a declarative markup language. XAML は .NET Core プログラミング モデルに適用されるので、.NET Core アプリの UI を簡単に作成できます。As applied to the .NET Core programming model, XAML simplifies creating a UI for a .NET Core app. 表示される UI 要素を宣言型 XAML マークアップで作成し、部分クラス定義を通じてマークアップに結合される分離コード ファイルを使用して、UI 定義をランタイム ロジックから分離させることができます。You can create visible UI elements in the declarative XAML markup, and then separate the UI definition from the run-time logic by using code-behind files that are joined to the markup through partial class definitions. XAML は、アセンブリで定義される特定のバッキング型のセットにおけるオブジェクトのインスタンス化を直接表します。XAML directly represents the instantiation of objects in a specific set of backing types defined in assemblies. これは、バッキング型システムへのこのような直接の結びつきのない一般的にインタープリタ型言語である、他のほとんどのマークアップ言語とは異なります。This is unlike most other markup languages, which are typically an interpreted language without such a direct tie to a backing type system. XAML を使用すると、別々の関係者が異なるツールを使用してアプリの UI やロジックを扱うことができるワークフローが可能になります。XAML enables a workflow where separate parties can work on the UI and the logic of an app, using potentially different tools.

XAML ファイルは、テキストとして表された場合、通常 .xaml 拡張子を持つ XML ファイルです。When represented as text, XAML files are XML files that generally have the .xaml extension. ファイルは任意の XML エンコードでエンコードできますが、UTF-8 としてエンコードするのが一般的です。The files can be encoded by any XML encoding, but encoding as UTF-8 is typical.

次の例は、UI の一部としてボタンを作成する方法を示しています。The following example shows how you might create a button as part of a UI. この例は、XAML が一般的な UI プログラミング メタファーを表す方法を簡単に紹介することを目的としています (完全なサンプルではありません)。This example is intended to give you a flavor of how XAML represents common UI programming metaphors (it is not a complete sample).

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

XAML 構文の概要XAML syntax in brief

次のセクションでは、XAML 構文の基本的な形式について説明し、簡潔なマークアップの例を示します。The following sections explain the basic forms of XAML syntax, and give a short markup example. これらのセクションは、各構文形式に関する完全な情報 (これらがバッキング型システムでどのように表されるかなど) を提供するものではありません。These sections are not intended to provide complete information about each syntax form, such as how these are represented in the backing type system. XAML 構文の詳細については、「XAML 構文の詳細」を参照してください。For more information about the specifics of XAML syntax, see XAML Syntax In Detail.

次のいくつかのセクションに含まれる内容の大部分は、XML 言語になじみがある方には初歩的なものになります。Much of the material in the next few sections will be elementary to you if you have previous familiarity with the XML language. これは、XAML の基本的な設計原則の 1 つによる結果です。This is a consequence of one of the basic design principles of XAML. XAML 言語では独自の概念が定義されていますが、これらの概念は XML 言語およびマークアップ形式内で作用します。The XAML language defines concepts of its own, but these concepts work within the XML language and markup form.

XAML オブジェクト要素XAML object elements

オブジェクト要素は、通常、型のインスタンスを宣言します。An object element typically declares an instance of a type. この型は、言語として XAML を使用するテクノロジによって参照されるアセンブリ内で定義されます。That type is defined in the assemblies referenced by the technology that uses XAML as a language.

オブジェクト要素の構文は必ず、始め山かっこ (<) で開始します。Object element syntax always starts with an opening angle bracket (<). この後に、インスタンスを作成する型の名前が続きます。This is followed by the name of the type where you want to create an instance. (この名前には、後で説明する概念であるプレフィックスを含めることができます)。この後、必要に応じて、オブジェクト要素の属性を宣言できます。(The name can include a prefix, a concept that will be explained later.) After this, you can optionally declare attributes on the object element. オブジェクト要素タグを完了するには、終わり山かっこ (>) で終了します。To complete the object element tag, end with a closing angle bracket (>). 代わりに、スラッシュと終わり山かっこを続けて入力 (/>) してタグを完了することで、コンテンツのない自己終了形式を使用することもできます。You can instead use a self-closing form that does not have any content, by completing the tag with a forward slash and closing angle bracket in succession (/>). たとえば、前に示したマークアップ スニペットをもう一度見てください。For example, look at the previously shown markup snippet again.

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

これは、2 つのオブジェクト要素を指定しています。<StackPanel> (コンテンツを含み、後に終了タグ) と <Button .../> (複数の属性を持つ自己終了形式) です。This specifies two object elements: <StackPanel> (with content, and a closing tag later), and <Button .../> (the self-closing form, with several attributes). オブジェクト要素 StackPanel および Button はそれぞれ、WPF によって定義されかつ WPF アセンブリの一部であるクラスの名前にマップされます。The object elements StackPanel and Button each map to the name of a class that is defined by WPF and is part of the WPF assemblies. オブジェクト要素タグを指定する場合は、基になる型の新しいインスタンスを作成するための XAML 処理の命令を作成します。When you specify an object element tag, you create an instruction for XAML processing to create a new instance of the underlying type. 各インスタンスは、XAML の解析および読み込み時に基になる型のパラメーターなしのコンストラクターを呼び出すことによって作成されます。Each instance is created by calling the parameterless constructor of the underlying type when parsing and loading the XAML.

属性構文 (プロパティ)Attribute syntax (properties)

オブジェクトのプロパティは、多くの場合、オブジェクト要素の属性として表現できます。Properties of an object can often be expressed as attributes of the object element. 属性構文では、設定するオブジェクト プロパティの名前を指定し、その後に代入演算子 (=) を付けます。The attribute syntax names the object property that is being set, followed by the assignment operator (=). 属性の値は、常に引用符で囲まれた文字列として指定されます。The value of an attribute is always specified as a string that is contained within quotation marks.

属性構文は、最も簡素化されたプロパティ設定の構文であり、過去にマークアップ言語を使用したことのある開発者が最も直感的に使用できる構文です。Attribute syntax is the most streamlined property setting syntax and is the most intuitive syntax to use for developers who have used markup languages in the past. たとえば、次のマークアップは、Content として指定された表示テキストに加えて、赤色のテキストと青色の背景が設定されたボタンを作成します。For example, the following markup creates a button that has red text and a blue background in addition to display text specified as Content.

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

プロパティ要素構文Property element syntax

オブジェクト要素の一部のプロパティでは、属性構文は使用できません。これは、プロパティ値を指定するために必要なオブジェクトまたは情報を、属性構文の引用符および文字列制限内で適切に表現できないためです。For some properties of an object element, attribute syntax is not possible, because the object or information necessary to provide the property value cannot be adequately expressed within the quotation mark and string restrictions of attribute syntax. このような場合は、プロパティ要素構文として知られる別の構文を使用できます。For these cases, a different syntax known as property element syntax can be used.

プロパティ要素の開始タグの構文は <TypeName.PropertyName> です。The syntax for the property element start tag is <TypeName.PropertyName>. 通常、そのタグの内容は、プロパティがその値として受け取る型のオブジェクト要素です。Generally, the content of that tag is an object element of the type that the property takes as its value. 内容を指定した後は、終了タグでプロパティ要素を閉じる必要があります。After specifying the content, you must close the property element with an end tag. 終了タグの構文は </TypeName.PropertyName> です。The syntax for the end tag is </TypeName.PropertyName>.

属性構文を使用できる場合は、通常、属性構文を使用する方が便利であり、よりコンパクトなマークアップが可能になりますが、これは多くの場合、技術的な制限ではなく、スタイルの問題にすぎません。If an attribute syntax is possible, using the attribute syntax is typically more convenient and enables a more compact markup, but that is often just a matter of style, not a technical limitation. 次の例では、前の属性構文の例で設定されているものと同じプロパティを示していますが、今回は Button のすべてのプロパティにプロパティ要素構文を使用しています。The following example shows the same properties being set as in the previous attribute syntax example, but this time by using property element syntax for all properties of the Button.

<Button>
  <Button.Background>
    <SolidColorBrush Color="Blue"/>
  </Button.Background>
  <Button.Foreground>
    <SolidColorBrush Color="Red"/>
  </Button.Foreground>
  <Button.Content>
    This is a button
  </Button.Content>
</Button>

コレクション構文Collection syntax

XAML 言語には、より人間が読みやすいマークアップを生成するための最適化がいくつか含まれています。The XAML language includes some optimizations that produce more human-readable markup. このような最適化の 1 つは、特定のプロパティがコレクション型を受け取る場合、そのプロパティの値内の子要素としてマークアップで宣言する項目がコレクションの一部になるということです。One such optimization is that if a particular property takes a collection type, then items that you declare in markup as child elements within that property's value become part of the collection. この場合、子オブジェクト要素のコレクションは、コレクション プロパティに設定される値です。In this case a collection of child object elements is the value being set to the collection property.

次の例は、GradientStops プロパティの値を設定するためのコレクション構文を示しています。The following example shows collection syntax for setting values of the GradientStops property.

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->
    <GradientStop Offset="0.0" Color="Red" />
    <GradientStop Offset="1.0" Color="Blue" />
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

XAML コンテンツのプロパティXAML content properties

XAML では言語機能が指定され、これにより、クラスはそのプロパティの 1 つだけを XAML "コンテンツ" プロパティに指定できます。XAML specifies a language feature whereby a class can designate exactly one of its properties to be the XAML content property. そのオブジェクト要素の子要素は、そのコンテンツ プロパティの値を設定するために使用されます。Child elements of that object element are used to set the value of that content property. つまり、そのコンテンツ プロパティを一意にするために、XAML マークアップでそのプロパティを設定するときにプロパティ要素を省略し、マークアップ内でより可視的な親/子メタファーを生成することができます。In other words, for the content property uniquely, you can omit a property element when setting that property in XAML markup and produce a more visible parent/child metaphor in the markup.

たとえば、BorderChild の "コンテンツ" プロパティを指定します。For example, Border specifies a content property of Child. 次の 2 つの Border 要素は、同一に扱われます。The following two Border elements are treated identically. 1 つ目は、コンテンツ プロパティ構文を利用して、Border.Child プロパティ要素を省略しています。The first one takes advantage of the content property syntax and omits the Border.Child property element. 2 つ目は Border.Child を明示的に示しています。The second one shows Border.Child explicitly.

<Border>
  <TextBox Width="300"/>
</Border>
<!--explicit equivalent-->
<Border>
  <Border.Child>
    <TextBox Width="300"/>
  </Border.Child>
</Border>

XAML 言語の規則として、XAML コンテンツ プロパティの値は、そのオブジェクト要素の他のプロパティ要素の完全に前または完全に後のいずれかに指定する必要があります。As a rule of the XAML language, the value of a XAML content property must be given either entirely before or entirely after any other property elements on that object element. たとえば、次のマークアップはコンパイルされません。For instance, the following markup does not compile.

<Button>I am a
  <Button.Background>Blue</Button.Background>
  blue button</Button>

XAML 構文の詳細については、「XAML 構文の詳細」を参照してください。For more information about the specifics of XAML syntax, see XAML Syntax In Detail.

テキスト コンテンツText content

少数の XAML 要素では、テキストをそのコンテンツとして直接処理できます。A small number of XAML elements can directly process text as their content. これを有効にするには、次のいずれかのケースが満たされている必要があります。To enable this, one of the following cases must be true:

  • クラスでコンテンツ プロパティを宣言する必要があり、そのコンテンツ プロパティは文字列に割り当て可能な型である必要があります (型は Object である場合もあります)。The class must declare a content property, and that content property must be of a type assignable to a string (the type could be Object). たとえば、任意の ContentControl がそのコンテンツ プロパティとして Content を使用し、それが型 Object である場合、これは Button などの ContentControl で次の使用法をサポートします: <Button>Hello</Button>For instance, any ContentControl uses Content as its content property and it is type Object, and this supports the following usage on a ContentControl such as a Button: <Button>Hello</Button>.

  • 型で型コンバーターを宣言する必要があります。この場合、テキスト コンテンツは、その型コンバーターの初期化テキストとして使用されます。The type must declare a type converter, in which case the text content is used as initialization text for that type converter. たとえば、<Brush>Blue</Brush>Blue のコンテンツ値をブラシに変換します。For example, <Brush>Blue</Brush> converts the content value of Blue into a brush. このケースは、実際にはあまり一般的ではありません。This case is less common in practice.

  • 型は、既知の XAML 言語プリミティブである必要があります。The type must be a known XAML language primitive.

コンテンツ プロパティとコレクション構文の組み合わせContent properties and collection syntax combined

次の例について考えます。Consider this example.

<StackPanel>
  <Button>First Button</Button>
  <Button>Second Button</Button>
</StackPanel>

ここでは、各 ButtonStackPanel の子要素です。Here, each Button is a child element of StackPanel. これは、2 つの異なる理由から 2 つのタグを省略している、簡素化された直感的なマークアップです。This is a streamlined and intuitive markup that omits two tags for two different reasons.

  • 省略された StackPanel.Children プロパティ要素: StackPanelPanel から派生します。Omitted StackPanel.Children property element: StackPanel derives from Panel. PanelPanel.Children をその XAML コンテンツ プロパティとして定義します。Panel defines Panel.Children as its XAML content property.

  • 省略された UIElementCollection オブジェクト要素: Panel.Children プロパティは、IList を実装する型 UIElementCollection を取ります。Omitted UIElementCollection object element: The Panel.Children property takes the type UIElementCollection, which implements IList. コレクションの要素タグは、IList などのコレクションの処理に関する XAML ルールに基づいて省略できます。The collection's element tag can be omitted, based on the XAML rules for processing collections such as IList. (この場合、UIElementCollection はパラメーターなしのコンストラクターを公開しないため、実際にはインスタンス化できません。そのため、UIElementCollection オブジェクト要素はコメントアウトされて示されています。)(In this case, UIElementCollection actually cannot be instantiated because it does not expose a parameterless constructor, and that is why the UIElementCollection object element is shown commented out).

<StackPanel>
  <StackPanel.Children>
    <!--<UIElementCollection>-->
    <Button>First Button</Button>
    <Button>Second Button</Button>
    <!--</UIElementCollection>-->
  </StackPanel.Children>
</StackPanel>

属性構文 (イベント)Attribute syntax (events)

属性構文は、プロパティではなくイベントであるメンバーにも使用できます。Attribute syntax can also be used for members that are events rather than properties. この場合、属性の名前はイベントの名前です。In this case, the attribute's name is the name of the event. XAML のイベントの WPF 実装では、属性の値は、そのイベントのデリゲートを実装するハンドラーの名前です。In the WPF implementation of events for XAML, the attribute's value is the name of a handler that implements that event's delegate. たとえば、次のマークアップは、マークアップで作成された ButtonClick イベントのハンドラーを割り当てます。For example, the following markup assigns a handler for the Click event to a Button created in markup:

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>

WPF のイベントおよび XAML には、属性構文のこの例以外にも多くのものがあります。There is more to events and XAML in WPF than just this example of the attribute syntax. たとえば、ここで参照されている ClickHandler は何を表し、どのように定義されているのか疑問に思うかもしれません。For example, you might wonder what the ClickHandler referenced here represents and how it is defined. これについては、この記事の後半の「イベントと XAML コードビハインド」セクションで説明します。This will be explained in the upcoming Events and XAML code-behind section of this article.

XAML の大文字と小文字の区別と空白Case and white space in XAML

一般に、XAML では大文字と小文字が区別されます。In general, XAML is case-sensitive. バッキング型を解決するために、WPF XAML では、CLR で大文字と小文字が区別されるのと同じ規則によって大文字と小文字を区別します。For purposes of resolving backing types, WPF XAML is case-sensitive by the same rules that the CLR is case-sensitive. オブジェクト要素、プロパティ要素、および属性名はすべて、アセンブリ内の基になる型または型のメンバーと名前で比較されるときに、大文字と小文字の区別を使用して指定する必要があります。Object elements, property elements, and attribute names must all be specified by using the sensitive casing when compared by name to the underlying type in the assembly, or to a member of a type. XAML 言語のキーワードとプリミティブでも、大文字と小文字が区別されます。XAML language keywords and primitives are also case-sensitive. 値の大文字と小文字は、必ずしも区別されるとは限りません。Values are not always case-sensitive. 値の大文字と小文字が区別されるかどうかは、値を受け取るプロパティに関連付けられている型コンバーターの動作、またはプロパティ値の型によって異なります。Case sensitivity for values will depend on the type converter behavior associated with the property that takes the value, or the property value type. たとえば、Boolean 型を受け取るプロパティは、true または True を同等の値として受け取ることができますが、これは、Boolean への文字列のネイティブ WPF XAML パーサーの型変換で、これらが同等として既に許可されているためです。For example, properties that take the Boolean type can take either true or True as equivalent values, but only because the native WPF XAML parser type conversion for string to Boolean already permits these as equivalents.

WPF XAML プロセッサおよびシリアライザーは、すべての重要でない空白を無視または削除し、意味のある空白をすべて正規化します。WPF XAML processors and serializers will ignore or drop all nonsignificant white space, and will normalize any significant white space. これは、XAML 仕様の既定の空白に対する動作の推奨事項と一致します。This is consistent with the default white-space behavior recommendations of the XAML specification. この動作が重要であるのは、XAML コンテンツ プロパティ内で文字列を指定するときのみです。This behavior is only of consequence when you specify strings within XAML content properties. 簡単に言うと、XAML は空白、改行、およびタブの各文字を空白に変換し、隣接する文字列のいずれかの端で 1 つの空白を保持します (見つかった場合)。In simplest terms, XAML converts space, linefeed, and tab characters into spaces, and then preserves one space if found at either end of a contiguous string. XAML の空白の処理に関する完全な説明については、この記事では扱いません。The full explanation of XAML white-space handling is not covered in this article. 詳細については、「XAML での空白の処理」を参照してください。For more information, see White space processing in XAML.

マークアップ拡張機能Markup extensions

マークアップ拡張は、XAML 言語の概念です。Markup extensions are a XAML language concept. 属性構文の値を指定するために使用する場合、中かっこ ({}) は、マークアップ拡張の使用を示します。When used to provide the value of an attribute syntax, curly braces ({ and }) indicate a markup extension usage. この使用法は、リテラル文字列または文字列変換可能な値のいずれかとしての属性値の一般的な扱いを回避するように、XAML 処理に指示します。This usage directs the XAML processing to escape from the general treatment of attribute values as either a literal string or a string-convertible value.

WPF アプリのプログラミングで使用される最も一般的なマークアップ拡張は、データ バインディング式に使用される Binding と、リソース参照の StaticResource および DynamicResource です。The most common markup extensions used in WPF app programming are Binding, used for data binding expressions, and the resource references StaticResource and DynamicResource. マークアップ拡張を使用すると、プロパティが一般に属性構文をサポートしていない場合でも、属性構文を使用してそのプロパティの値を指定できます。By using markup extensions, you can use attribute syntax to provide values for properties even if that property does not support an attribute syntax in general. マークアップ拡張では、多くの場合、中間式の型を使用して、値の保留や、実行時にのみ存在する他のオブジェクトの参照などの機能が有効化されます。Markup extensions often use intermediate expression types to enable features such as deferring values or referencing other objects that are only present at run-time.

たとえば、次のマークアップは、属性構文を使用して Style プロパティの値を設定します。For example, the following markup sets the value of the Style property using attribute syntax. Style プロパティは、既定では属性構文の文字列によってインスタンス化できなかった Style クラスのインスタンスを受け取ります。The Style property takes an instance of the Style class, which by default could not be instantiated by an attribute syntax string. ただし、この場合、属性は特定のマークアップ拡張 StaticResource を参照します。But in this case, the attribute references a particular markup extension, StaticResource. このマークアップ拡張が処理されると、リソース ディクショナリのキー付きリソースとして前にインスタンス化されていたスタイルへの参照が返されます。When that markup extension is processed, it returns a reference to a style that was previously instantiated as a keyed resource in a resource dictionary.

<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>
<StackPanel>
  <Border Style="{StaticResource PageBackground}">
  </Border>
</StackPanel>

WPF で特別に実装されている XAML のすべてのマークアップ拡張のリファレンス一覧については、「WPF XAML 拡張機能」を参照してください。For a reference listing of all markup extensions for XAML implemented specifically in WPF, see WPF XAML Extensions. System.Xaml によって定義され、.NET Core XAML の実装でより広範に使用できるマークアップ拡張のリファレンス一覧については、「XAML 名前空間 (x:)言語機能」を参照してください。For a reference listing of the markup extensions that are defined by System.Xaml and are more widely available for .NET Core XAML implementations, see XAML Namespace (x:) Language Features. マークアップ拡張の概念の詳細については、 「マークアップ拡張機能と WPF XAML」を参照してください。For more information about markup extension concepts, see Markup Extensions and WPF XAML.

型コンバーターType converters

XAML 構文の概要」セクションでは、属性値を文字列によって設定できる必要があると記載しました。In the XAML Syntax in Brief section, it was stated that the attribute value must be able to be set by a string. 文字列を他のオブジェクト型またはプリミティブ値に変換する方法の基本的でネイティブな処理は、DateTimeUri などの特定の型のネイティブ処理に加えて、String 型自体に基づきます。The basic, native handling of how strings are converted into other object types or primitive values is based on the String type itself, in addition to native processing for certain types such as DateTime or Uri. ただし、WPF の型やそれらの型のメンバーの多くは、より複雑なオブジェクト型のインスタンスを文字列および属性として指定できるように、基本的な文字列属性処理動作を拡張します。But many WPF types or members of those types extend the basic string attribute processing behavior in such a way that instances of more complex object types can be specified as strings and attributes.

Thickness 構造体は、XAML の使用に対して型変換が有効になっている型の例です。The Thickness structure is an example of a type that has a type conversion enabled for XAML usages. Thickness は、入れ子になった四角形内の測定値を示し、Margin などのプロパティの値として使用されます。Thickness indicates measurements within a nested rectangle and is used as the value for properties such as Margin. 型コンバーターを Thickness に配置すると、Thickness を使用するすべてのプロパティが属性として指定できるため、それらを XAML で簡単に指定できます。By placing a type converter on Thickness, all properties that use a Thickness are easier to specify in XAML because they can be specified as attributes. 次の例では、型変換と属性構文を使用して、Margin の値を指定しています。The following example uses a type conversion and attribute syntax to provide a value for a Margin:

<Button Margin="10,20,10,30" Content="Click me"/>

前の属性構文の例は、次のより詳細な構文の例と同じです。ここで、Margin は代わりに、Thickness オブジェクト要素を含むプロパティ要素構文を通じて設定されています。The previous attribute syntax example is equivalent to the following more verbose syntax example, where the Margin is instead set through property element syntax containing a Thickness object element. Thickness の 4 つの主なプロパティは、新しいインスタンスの属性として設定されています。The four key properties of Thickness are set as attributes on the new instance:

<Button Content="Click me">
  <Button.Margin>
    <Thickness Left="10" Top="20" Right="10" Bottom="30"/>
  </Button.Margin>
</Button>

注意

型自体にパラメーターなしのコンストラクターがないため、サブクラスを伴わずにその型にプロパティを設定する唯一のパブリックな方法が型変換であるオブジェクトの数も限られています。There are also a limited number of objects where the type conversion is the only public way to set a property to that type without involving a subclass, because the type itself does not have a parameterless constructor. たとえば Cursor です。An example is Cursor.

型変換の詳細については、「TypeConverters および XAML」を参照してください。For more information on type conversion, see TypeConverters and XAML.

XAML ルート要素と XAML 名前空間XAML root elements and XAML namespaces

XAML ファイルは、整形式の XML ファイルであると同時に有効な XAML ファイルであるためには、ルート要素を 1 つだけ持つ必要があります。A XAML file must have only one root element, in order to be both a well-formed XML file and a valid XAML file. 一般的な WPF のシナリオでは、WPF アプリ モデルで顕著な意味を持つルート要素を使用します (たとえば、ページの場合は WindowPage、外部辞書の場合は ResourceDictionary、アプリ定義の場合は Application)。For typical WPF scenarios, you use a root element that has a prominent meaning in the WPF app model (for example, Window or Page for a page, ResourceDictionary for an external dictionary, or Application for the app definition). 次の例は、Page のルート要素を使用して、WPF ページの一般的な XAML ファイルのルート要素を示しています。The following example shows the root element of a typical XAML file for a WPF page, with the root element of Page.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Page>

また、ルート要素には、xmlns および xmlns:x 属性が含まれます。The root element also contains the attributes xmlns and xmlns:x. これらの属性は XAML プロセッサに対して、マークアップが要素として参照するバッキング型の型定義を含む XAML 名前空間を示します。These attributes indicate to a XAML processor which XAML namespaces contain the type definitions for backing types that the markup will reference as elements. xmlns 属性は、具体的に既定の XAML 名前空間を示します。The xmlns attribute specifically indicates the default XAML namespace. 既定の XAML 名前空間内では、マークアップ内のオブジェクト要素をプレフィックスなしで指定できます。Within the default XAML namespace, object elements in the markup can be specified without a prefix. ほとんどの WPF アプリ シナリオと、SDK の WPF セクションに示されているほとんどすべての例では、既定の XAML 名前空間は WPF 名前空間 http://schemas.microsoft.com/winfx/2006/xaml/presentation にマップされます。For most WPF app scenarios, and for almost all of the examples given in the WPF sections of the SDK, the default XAML namespace is mapped to the WPF namespace http://schemas.microsoft.com/winfx/2006/xaml/presentation. xmlns:x 属性は、XAML 言語の名前空間 http://schemas.microsoft.com/winfx/2006/xaml をマップする追加の XAML 名前空間を示します。The xmlns:x attribute indicates an additional XAML namespace, which maps the XAML language namespace http://schemas.microsoft.com/winfx/2006/xaml.

名前スコープの使用とマッピングに対するスコープを定義する xmlns のこの使用法は、XML 1.0 仕様と一致しています。This usage of xmlns to define a scope for usage and mapping of a namescope is consistent with the XML 1.0 specification. XAML 名前スコープが XML 名前スコープと異なるのは、XAML 名前スコープが、型の解決および XAML の解析に関して、名前スコープの要素がどのように型によってサポートされるかについても何かを示すという点だけです。XAML namescopes are different from XML namescopes only in that a XAML namescope also implies something about how the namescope's elements are backed by types when it comes to type resolution and parsing the XAML.

xmlns 属性は、各 XAML ファイルのルート要素でのみ厳密に必要です。The xmlns attributes are only strictly necessary on the root element of each XAML file. xmlns 定義は、ルート要素のすべての子孫要素に適用されます (この動作も、xmlns の XML 1.0 仕様と同じです)。また、xmlns 属性はルートの下の他の要素でも許可され、定義している要素の子孫要素に適用されます。xmlns definitions will apply to all descendant elements of the root element (this behavior is again consistent with the XML 1.0 specification for xmlns.) xmlns attributes are also permitted on other elements underneath the root, and would apply to any descendant elements of the defining element. ただし、XAML 名前空間を頻繁に定義または再定義すると、XAML マークアップ スタイルが読みにくくなる可能性があります。However, frequent definition or redefinition of XAML namespaces can result in a XAML markup style that is difficult to read.

XAML プロセッサの WPF 実装には、WPF コア アセンブリを認識するインフラストラクチャが含まれています。The WPF implementation of its XAML processor includes an infrastructure that has awareness of the WPF core assemblies. WPF コア アセンブリには、既定の XAML 名前空間への WPF マッピングをサポートする型が含まれていることがわかっています。The WPF core assemblies are known to contain the types that support the WPF mappings to the default XAML namespace. これは、プロジェクト ビルド ファイルの一部である構成と、WPF ビルドおよびプロジェクト システムによって有効になります。This is enabled through configuration that is part of your project build file and the WPF build and project systems. そのため、WPF アセンブリからの XAML 要素を参照するために必要なことは、既定の XAML 名前空間を既定の xmlns として宣言することだけです。Therefore, declaring the default XAML namespace as the default xmlns is all that is necessary in order to reference XAML elements that come from WPF assemblies.

x: プレフィックスThe x: prefix

前のルート要素の例では、XAML の言語コンストラクトをサポートする専用の XAML 名前空間である XAML 名前空間 http://schemas.microsoft.com/winfx/2006/xaml をマップするために、プレフィックス x: が使用されていました。In the previous root element example, the prefix x: was used to map the XAML namespace http://schemas.microsoft.com/winfx/2006/xaml, which is the dedicated XAML namespace that supports XAML language constructs. この x: プレフィックスは、プロジェクトのテンプレート、例、およびこの SDK 全体のドキュメントで、この XAML 名前空間をマップするために使用されています。This x: prefix is used for mapping this XAML namespace in the templates for projects, in examples, and in documentation throughout this SDK. XAML 言語の XAML 名前空間には、XAML で頻繁に使用するプログラミング コンストラクトがいくつか含まれています。The XAML namespace for the XAML language contains several programming constructs that you will use frequently in your XAML. 次に、ユーザーが使用する最も一般的な x: プレフィックスのプログラミング コンストラクトの一覧を示します。The following is a listing of the most common x: prefix programming constructs you will use:

  • x:Key:ResourceDictionary (または、他のフレームワークの同様のディクショナリの概念) のリソースごとに一意のキーを設定します。x:Key: Sets a unique key for each resource in a ResourceDictionary (or similar dictionary concepts in other frameworks). x:Key は、一般的な WPF アプリのマークアップに見られる x: の使用の 90% を占めます。x:Key will probably account for 90 percent of the x: usages you will see in a typical WPF app's markup.

  • x:Class:XAML ページにコードビハインドを提供するクラスの CLR 名前空間とクラス名を指定します。x:Class: Specifies the CLR namespace and class name for the class that provides code-behind for a XAML page. WPF プログラミング モデルごとにコードビハインドをサポートするには、このようなクラスが必要です。そのため、リソースがない場合でも、ほとんどの場合、x: がマップされていることがわかります。You must have such a class to support code-behind per the WPF programming model, and therefore you almost always see x: mapped, even if there are no resources.

  • x:Name:オブジェクト要素が処理された後にランタイム コードに存在するインスタンスのランタイム オブジェクト名を指定します。x:Name: Specifies a run-time object name for the instance that exists in run-time code after an object element is processed. 一般に、x:Name には、WPF で定義された同等のプロパティをよく使用します。In general, you will frequently use a WPF-defined equivalent property for x:Name. このようなプロパティは、特に CLR バッキング プロパティにマップされるため、初期化された XAML から名前付き要素を見つけるためにランタイム コードをよく使用するアプリのプログラミングにはより便利です。Such properties map specifically to a CLR backing property and are thus more convenient for app programming, where you frequently use run-time code to find the named elements from initialized XAML. そのようなプロパティの中で最も一般的なものは FrameworkElement.Name です。The most common such property is FrameworkElement.Name. x:Name は、同等の WPF フレームワーク レベルの Name プロパティが特定の型でサポートされていない場合でも使用できます。You might still use x:Name when the equivalent WPF framework-level Name property is not supported in a particular type. これは、特定のアニメーション シナリオで発生します。This occurs in certain animation scenarios.

  • x:Static:本来なら XAML と互換性のあるプロパティではない静的な値を返す参照を有効にします。x:Static: Enables a reference that returns a static value that is not otherwise a XAML-compatible property.

  • x:Type:型名に基づいて Type 参照を作成します。x:Type: Constructs a Type reference based on a type name. これは、Style.TargetType などの Type を受け取る属性を指定するために使用されますが、x:Type マークアップ拡張の使用がオプションであるように、プロパティに文字列から Type へのネイティブ変換が含まれることがよくあります。This is used to specify attributes that take Type, such as Style.TargetType, although frequently the property has native string-to-Type conversion in such a way that the x:Type markup extension usage is optional.

x: プレフィックス/XAML 名前空間には、あまり一般的ではない追加のプログラミング コンストラクトがあります。There are additional programming constructs in the x: prefix/XAML namespace, which are not as common. 詳細については、「XAML 名前空間 (x:)言語機能」を参照してください。For details, see XAML Namespace (x:) Language Features.

XAML のカスタム プレフィックスとカスタム型Custom prefixes and custom types in XAML

独自のカスタム アセンブリの場合、または PresentationCorePresentationFramework および WindowsBase の WPF コア以外のアセンブリの場合は、カスタム xmlns マッピングの一部としてアセンブリを指定できます。For your own custom assemblies, or for assemblies outside the WPF core of PresentationCore, PresentationFramework and WindowsBase, you can specify the assembly as part of a custom xmlns mapping. その後、試みている XAML の使用をサポートするように型が正しく実装されていれば、XAML でそのアセンブリから型を参照することができます。You can then reference types from that assembly in your XAML, so long as that type is correctly implemented to support the XAML usages you are attempting.

次に、カスタム プレフィックスが XAML マークアップでどのように機能するかの基本的な例を示します。The following is a basic example of how custom prefixes work in XAML markup. プレフィックス custom は、ルート要素タグで定義され、特定のアセンブリ (パッケージ化されてアプリで使用可能なもの) にマップされます。The prefix custom is defined in the root element tag, and mapped to a specific assembly that is packaged and available with the app. このアセンブリには NumericUpDown 型が含まれています。これは、一般的な XAML の使用をサポートするために実装され、WPF XAML コンテンツ モデル内のこの特定のポイントでその挿入を許可するクラスの継承を使用します。This assembly contains a type NumericUpDown, which is implemented to support general XAML usage as well as using a class inheritance that permits its insertion at this particular point in a WPF XAML content model. この NumericUpDown コントロールのインスタンスは、プレフィックスを使用してオブジェクト要素として宣言されます。これにより、XAML パーサーは、どの XAML 名前空間に型が含まれているか、したがって型定義を含むバッキング アセンブリがどこにあるかを認識します。An instance of this NumericUpDown control is declared as an object element, using the prefix so that a XAML parser knows which XAML namespace contains the type, and therefore where the backing assembly is that contains the type definition.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"
    >
  <StackPanel Name="LayoutRoot">
    <custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>
...
  </StackPanel>
</Page>

XAML のカスタム型の詳細については、「WPF における XAML とカスタム クラス」を参照してください。For more information about custom types in XAML, see XAML and Custom Classes for WPF.

アセンブリ内の XML 名前空間とコード名前空間がどのように関連しているかの詳細については、「XAML 名前空間および WPF XAML の名前空間の割り当て」を参照してください。For more information about how XML namespaces and code namespaces in assemblies are related, see XAML Namespaces and Namespace Mapping for WPF XAML.

イベントと XAML コードビハインドEvents and XAML code-behind

ほとんどの WPF アプリは、XAML マークアップとコードビハインドの両方で構成されています。Most WPF apps consist of both XAML markup and code-behind. プロジェクト内で、XAML は .xaml ファイルとして記述され、Microsoft Visual Basic や C# などの CLR 言語が分離コード ファイルの記述に使用されます。Within a project, the XAML is written as a .xaml file, and a CLR language such as Microsoft Visual Basic or C# is used to write a code-behind file. XAML ファイルが WPF プログラミングおよびアプリケーションのモデルの一部としてマークアップ コンパイルされている場合、XAML ファイルの XAML 分離コード ファイルの場所は、XAML のルート要素の x:Class 属性として名前空間とクラスを指定することによって識別されます。When a XAML file is markup compiled as part of the WPF programming and application models, the location of the XAML code-behind file for a XAML file is identified by specifying a namespace and class as the x:Class attribute of the root element of the XAML.

ここまでの例でいくつかのボタンを確認しましたが、これらのボタンのいずれにも論理的な動作はまだ関連付けられていませんでした。In the examples so far, you have seen several buttons, but none of these buttons had any logical behavior associated with them yet. オブジェクト要素の動作を追加するための主要なアプリケーション レベルの方法は、要素クラスの既存のイベントを使用し、実行時にそのイベントが発生したときに呼び出されるイベントの特定のハンドラーを記述することです。The primary application-level mechanism for adding a behavior for an object element is to use an existing event of the element class, and to write a specific handler for that event that is invoked when that event is raised at run-time. イベント名と、使用するハンドラーの名前はマークアップで指定されますが、ハンドラーを実装するコードはコードビハインドで定義されます。The event name and the name of the handler to use are specified in the markup, whereas the code that implements your handler is defined in the code-behind.

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>
namespace ExampleNamespace
{
  public partial class ExamplePage
  {
    void Button_Click(object sender, RoutedEventArgs e)
    {
      Button b = e.Source as Button;
      b.Foreground = Brushes.Red;
    }
  }
}
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim b As Button = e.Source
    b.Foreground = Brushes.Red
End Sub

分離コード ファイルは CLR 名前空間 ExampleNamespace を使用し、その名前空間内の部分クラスとして ExamplePage を宣言していることに注意してください。Notice that the code-behind file uses the CLR namespace ExampleNamespace and declares ExamplePage as a partial class within that namespace. これは、ExampleNamespace.ExamplePagex:Class 属性値と同等です。This parallels the x:Class attribute value of ExampleNamespace.ExamplePage これはマークアップ ルートで指定されました。that was provided in the markup root. WPF マークアップ コンパイラは、ルート要素型からクラスを派生させることによって、コンパイルされた XAML ファイルの部分クラスを作成します。The WPF markup compiler will create a partial class for any compiled XAML file, by deriving a class from the root element type. また同じ部分クラスを定義するコードビハインドを指定すると、結果として得られるコードは、コンパイル済みアプリの同じ名前空間とクラス内で結合されます。When you provide code-behind that also defines the same partial class, the resulting code is combined within the same namespace and class of the compiled app.

WPF でのコードビハインド プログラミングの要件の詳細については、「WPF でのコードビハインド、イベント ハンドラー、および部分クラスの要件」を参照してください。For more information about requirements for code-behind programming in WPF, see Code-behind, Event Handler, and Partial Class Requirements in WPF.

別個の分離コード ファイルを作成したくない場合は、XAML ファイルでコードをインライン化することもできます。If you do not want to create a separate code-behind file, you can also inline your code in a XAML file. ただし、インライン コードは、かなりの制限がある汎用性の低い手法です。However, inline code is a less versatile technique that has substantial limitations. 詳細については、「WPF における分離コードと XAML」を参照してください。For more informaiton, see Code-Behind and XAML in WPF.

ルーティング イベントRouted events

WPF の基本となる特有のイベント機能は、ルーティング イベントです。A particular event feature that is fundamental to WPF is a routed event. ルーティング イベントを使用すると、要素がツリー リレーションシップを介して接続されていれば、要素は別の要素によって発生したイベントを処理できます。Routed events enable an element to handle an event that was raised by a different element, as long as the elements are connected through a tree relationship. XAML 属性を使用してイベント処理を指定する場合、ルーティング イベントは、任意の要素 (この特定のイベントをクラス メンバー テーブルに一覧表示しない要素を含む) に対してリッスンおよび処理することができます。When specifying event handling with a XAML attribute, the routed event can be listened for and handled on any element, including elements that do not list that particular event in the class members table. これは、イベント名属性を所有クラス名で修飾することで実現します。This is accomplished by qualifying the event name attribute with the owning class name. たとえば、進行中の StackPanel / Button の例の親 StackPanel は、属性値としてハンドラー名を使用して、StackPanel オブジェクト要素に属性 Button.Click を指定することによって、子要素ボタンの Click イベントのハンドラーを登録できます。For instance, the parent StackPanel in the ongoing StackPanel / Button example could register a handler for the child element button's Click event by specifying the attribute Button.Click on the StackPanel object element, with your handler name as the attribute value. 詳細については、「ルーティング イベントの概要」を参照してください。For more information, see Routed Events Overview.

XAML の名前付き要素XAML named elements

既定では、XAML オブジェクト要素を処理することによってオブジェクト グラフに作成されたオブジェクト インスタンスには、一意識別子もオブジェクト参照もありません。By default, the object instance that is created in an object graph by processing a XAML object element does not possess a unique identifier or object reference. これに対して、コードでコンストラクターを呼び出す場合は、そのほとんどにおいて、コンストラクターの結果を使用して、作成されたインスタンスに変数を設定するため、後でコード内でインスタンスを参照できます。In contrast, if you call a constructor in code, you almost always use the constructor result to set a variable to the constructed instance, so that you can reference the instance later in your code. マークアップ定義によって作成されたオブジェクトへの標準化されたアクセスを実現するために、XAML では x:Name 属性を定義します。In order to provide standardized access to objects that were created through a markup definition, XAML defines the x:Name attribute. 任意のオブジェクト要素に x:Name 属性の値を設定できます。You can set the value of the x:Name attribute on any object element. コードビハインドでは、選択した識別子が、作成されたインスタンスを参照するインスタンス変数に相当します。In your code-behind, the identifier you choose is equivalent to an instance variable that refers to the constructed instance. あらゆる点で、名前付き要素はオブジェクト インスタンスのように機能します (名前がそのインスタンスを参照します)。そして、コードビハインドによってその名前付き要素が参照され、アプリ内での実行時のやり取りを処理することができます。In all respects, named elements function as if they were object instances (the name references that instance), and your code-behind can reference the named elements to handle run-time interactions within the app. インスタンスと変数の間のこの接続は、WPF XAML マークアップ コンパイラによって行われます。具体的には、この記事では詳しく説明しない InitializeComponent などの機能やパターンに関連しています。This connection between instances and variables is accomplished by the WPF XAML markup compiler, and more specifically involve features and patterns such as InitializeComponent that will not be discussed in detail in this article.

WPF フレームワーク レベルの XAML 要素は、Name プロパティを継承します。これは、XAML で定義された x:Name 属性に相当します。WPF framework-level XAML elements inherit a Name property, which is equivalent to the XAML defined x:Name attribute. その他のクラスの中には、一般的に Name プロパティとして定義される x:Name のプロパティ レベルの同等のものを提供するものもあります。Certain other classes also provide property-level equivalents for x:Name, which is also generally defined as a Name property. 一般に、選択した要素または型のメンバー テーブルに Name プロパティを見つけられない場合は、代わりに x:Name を使用します。Generally speaking, if you cannot find a Name property in the members table for your chosen element/type, use x:Name instead. x:Name の値は、特定のサブシステム、または FindName などのユーティリティ メソッドのいずれかによって実行時に使用できる XAML 要素に識別子を提供します。The x:Name values will provide an identifier to a XAML element that can be used at run-time, either by specific subsystems or by utility methods such as FindName.

次の例では、StackPanel 要素で Name を設定します。The following example sets Name on a StackPanel element. 次に、その StackPanel 内の Button のハンドラーが、Name によって設定されたそのインスタンス参照 buttonContainer を通じて StackPanel を参照します。Then, a handler on a Button within that StackPanel references the StackPanel through its instance reference buttonContainer as set by Name.

<StackPanel Name="buttonContainer">
  <Button Click="RemoveThis">Click to remove this button</Button>
</StackPanel>
void RemoveThis(object sender, RoutedEventArgs e)
{
    FrameworkElement fe = e.Source as FrameworkElement;
    if (buttonContainer.Children.Contains(fe))
    {
        buttonContainer.Children.Remove(fe);
    }
}
 Private Sub RemoveThis(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
     Dim fe As FrameworkElement = e.Source
     If (buttonContainer.Children.Contains(fe)) Then
         buttonContainer.Children.Remove(fe)
     End If
End Sub

変数と同じように、インスタンスの XAML 名はスコープの概念によって管理されるので、予測可能な特定のスコープ内で名前が一意になるように強制することができます。Just like a variable, the XAML name for an instance is governed by a concept of scope, so that names can be enforced to be unique within a certain scope that is predictable. ページを定義する主要なマークアップは、1 つの一意の XAML 名前スコープを示し、XAML 名前スコープの境界はそのページのルート要素です。The primary markup that defines a page denotes one unique XAML namescope, with the XAML namescope boundary being the root element of that page. ただし、他のマークアップ ソースは、スタイルやスタイル内のテンプレートなど、実行時にページとやり取りすることができ、多くの場合、このようなマークアップ ソースには、ページの XAML 名前スコープと必ずしも接続しない独自の XAML 名前スコープがあります。However, other markup sources can interact with a page at run-time, such as styles or templates within styles, and such markup sources often have their own XAML namescopes that do not necessarily connect with the XAML namescope of the page. x:Name および XAML 名前スコープの詳細については、「Name」、「x:Name ディレクティブ」、または「WPF XAML 名前スコープ」を参照してください。For more information on x:Name and XAML namescopes, see Name, x:Name Directive, or WPF XAML Namescopes.

添付プロパティと添付イベントAttached properties and attached events

XAML では、特定のプロパティまたはイベントを、設定されている要素の型の定義にそのプロパティまたはイベントが存在するかどうかに関係なく、任意の要素に指定できるようにする言語機能が指定されます。XAML specifies a language feature that enables certain properties or events to be specified on any element, regardless of whether the property or event exists in the type's definitions for the element it is being set on. この機能のプロパティのバージョンは添付プロパティと呼ばれ、イベントのバージョンは添付イベントと呼ばれます。The properties version of this feature is called an attached property, the events version is called an attached event. 概念的には、添付プロパティと添付イベントは、任意の XAML 要素またはオブジェクト インスタンスに設定できるグローバル メンバーと考えることができます。Conceptually, you can think of attached properties and attached events as global members that can be set on any XAML element/object instance. ただし、その要素またはクラス、あるいはより大規模なインフラストラクチャでは、添付値のバッキング プロパティ ストアがサポートされている必要があります。However, that element/class or a larger infrastructure must support a backing property store for the attached values.

XAML の添付プロパティは、通常、属性構文を介して使用されます。Attached properties in XAML are typically used through attribute syntax. 属性構文では、形式 ownerType.propertyName で添付プロパティを指定します。In attribute syntax, you specify an attached property in the form ownerType.propertyName.

一見すると、これはプロパティ要素の使用法に似ていますが、この場合、指定する ownerType は、添付プロパティが設定されるオブジェクト要素とは常に異なる型です。Superficially, this resembles a property element usage, but in this case the ownerType you specify is always a different type than the object element where the attached property is being set. ownerType は、添付プロパティ値を取得または設定するために XAML プロセッサで必要とされるアクセサー メソッドを提供する型です。ownerType is the type that provides the accessor methods that are required by a XAML processor in order to get or set the attached property value.

添付プロパティの最も一般的なシナリオは、子要素が親要素にプロパティ値を報告できるようにすることです。The most common scenario for attached properties is to enable child elements to report a property value to their parent element.

次の例は、DockPanel.Dock 添付プロパティを示しています。The following example illustrates the DockPanel.Dock attached property. DockPanel クラスは、DockPanel.Dock のアクセサーを定義しているため、添付プロパティを所有しています。The DockPanel class defines the accessors for DockPanel.Dock and therefore owns the attached property. また、DockPanel クラスには、その子要素を反復処理して、特に DockPanel.Dock の設定値がないか各要素を検査するロジックが含まれています。The DockPanel class also includes logic that iterates its child elements and specifically checks each element for a set value of DockPanel.Dock. 値が検出されると、その値は子要素を配置するためにレイアウト中に使用されます。If a value is found, that value is used during layout to position the child elements. DockPanel.Dock 添付プロパティとこの配置機能の使用は、実際には DockPanel クラスの使用のきっかけとなるシナリオです。Use of the DockPanel.Dock attached property and this positioning capability is in fact the motivating scenario for the DockPanel class.

<DockPanel>
  <Button DockPanel.Dock="Left" Width="100" Height="20">I am on the left</Button>
  <Button DockPanel.Dock="Right" Width="100" Height="20">I am on the right</Button>
</DockPanel>

WPF では、添付プロパティのほとんどまたはすべてが依存関係プロパティとしても実装されます。In WPF, most or all the attached properties are also implemented as dependency properties. 詳細については、「添付プロパティの概要」を参照してください。For more information, see Attached Properties Overview.

添付イベントは、属性構文の同様の ownerType.eventName 形式を使用します。Attached events use a similar ownerType.eventName form of attribute syntax. 非添付イベントと同様に、XAML の添付イベントの属性値で、イベントが要素で処理されるときに呼び出されるハンドラー メソッドの名前を指定します。Just like the non-attached events, the attribute value for an attached event in XAML specifies the name of the handler method that is invoked when the event is handled on the element. WPF XAML での添付イベントの使用は、あまり一般的ではありません。Attached event usages in WPF XAML are less common. 詳細については、「添付イベントの概要」を参照してください。For more information, see Attached Events Overview.

基本型と XAMLBase types and XAML

基になる WPF XAML とその XAML 名前空間は、XAML のマークアップ要素に加えて、CLR オブジェクトに対応する型のコレクションです。Underlying WPF XAML and its XAML namespace is a collection of types that correspond to CLR objects in addition to markup elements for XAML. ただし、すべてのクラスを要素にマップできるわけではありません。However, not all classes can be mapped to elements. ButtonBase などの抽象クラスや、特定の非抽象基本クラスは、CLR オブジェクト モデルの継承に使用されます。Abstract classes, such as ButtonBase, and certain non-abstract base classes, are used for inheritance in the CLR objects model. 基底クラス (抽象のものも含む) は、具象 XAML 要素のそれぞれがその階層内の基底クラスからメンバーを継承するので、XAML 開発にとって引き続き重要です。Base classes, including abstract ones, are still important to XAML development because each of the concrete XAML elements inherits members from some base class in its hierarchy. 多くの場合、これらのメンバーには、要素の属性として設定できるプロパティや、処理できるイベントが含まれます。Often these members include properties that can be set as attributes on the element, or events that can be handled. FrameworkElement は、WPF フレームワーク レベルでの WPF の具象基底 UI クラスです。FrameworkElement is the concrete base UI class of WPF at the WPF framework level. UI を設計するときは、さまざまなシェイプ、パネル、デコレーター、またはコントロール クラスを使用しますが、これらはすべて FrameworkElement から派生します。When designing UI, you will use various shape, panel, decorator, or control classes, which all derive from FrameworkElement. 関連する基底クラスである FrameworkContentElement では、FrameworkElement 内の API を意図的にミラー化する API を使用して、フロー レイアウト プレゼンテーションに適したドキュメント指向の要素がサポートされています。A related base class, FrameworkContentElement, supports document-oriented elements that work well for a flow layout presentation, using APIs that deliberately mirror the APIs in FrameworkElement. 要素レベルの属性と CLR オブジェクト モデルの組み合わせにより、特定の XAML 要素とその基になる型に関係なく、ほとんどの具象 XAML 要素に設定できる一般的なプロパティのセットが提供されます。The combination of attributes at the element level and a CLR object model provides you with a set of common properties that are settable on most concrete XAML elements, regardless of the specific XAML element and its underlying type.

XAML におけるセキュリティXAML security

XAML は、オブジェクトのインスタンス化と実行を直接表すマークアップ言語です。XAML is a markup language that directly represents object instantiation and execution. そのため、XAML で作成された要素は、生成された同等のコードと同じように、システム リソース (ネットワーク アクセス、ファイル システム IO など) を操作できます。Therefore, elements created in XAML have the same ability to interact with system resources (network access, file system IO, for example) as the equivalent generated code does. 完全に信頼されたアプリに読み込まれた XAML は、ホスト アプリと同じようにシステム リソースにアクセスできます。XAML loaded in to a fully trusted app has the same access to the system resources as the hosting app does.

WPF におけるコード アクセス セキュリティ (CAS)Code Access Security (CAS) in WPF

このセクションが該当するのは .NET Framework のみです。 .NET Core の WPF では、CAS をサポートしていません。 詳細については、コード アクセス セキュリティの相違点に関する記事を参照してください。This section only applies to .NET Framework. WPF for .NET Core doesn't support CAS. For more information, see Code Access Security differences.

.NET Framework の WPF では、コード アクセス セキュリティ (CAS) がサポートされています。WPF for .NET Framework supports Code Access Security (CAS). これは、インターネット ゾーンで実行されている WPF コンテンツの実行アクセス許可が制限されていることを意味します。This means that WPF content running in the internet zone has reduced execution permissions. "Loose XAML" (XAML ビューアーによって読み込み時に解釈される、コンパイルされていない XAML のページ) と XBAP は、通常、このインターネット ゾーンで実行され、同じアクセス許可セットを使用します。"Loose XAML" (pages of noncompiled XAML interpreted at load time by a XAML viewer) and XBAP are usually run in this internet zone and use the same permission set. ただし、完全に信頼されたアプリケーションリに読み込まれた XAML は、ホスト アプリケーションと同じようにシステム リソースにアクセスできます。However, XAML loaded in to a fully trusted application has the same access to the system resources as the hosting application does. 詳細については、「WPF 部分信頼セキュリティ」を参照してください。For more information, see WPF Partial Trust Security.

コードからの XAML の読み込みLoading XAML from code

XAML は、すべての UI を定義するために使用できますが、XAML で UI の一部だけを定義することが適切な場合もあります。XAML can be used to define all of the UI, but it is sometimes also appropriate to define just a piece of the UI in XAML. この機能を使用すると、部分的なカスタマイズ、情報のローカル ストレージ、XAML を使用したビジネスオブジェクトの提供、または想定される各種シナリオが可能になります。This capability could be used to enable partial customization, local storage of information, using XAML to provide a business object, or a variety of possible scenarios. これらのシナリオにとって重要なのは、XamlReader クラスとその Load メソッドです。The key to these scenarios is the XamlReader class and its Load method. 入力は XAML ファイルであり、出力は、そのマークアップから作成されたオブジェクトの実行時ツリーのすべてを表すオブジェクトです。The input is a XAML file, and the output is an object that represents all of the run-time tree of objects that was created from that markup. そして、そのオブジェクトを、アプリに既に存在する別のオブジェクトのプロパティとして挿入できます。You then can insert the object to be a property of another object that already exists in the app. このプロパティが、最終的な表示機能を備え、かつ新しいコンテンツがアプリに追加されたことを実行エンジンに通知する、コンテンツ モデル内の適切なプロパティであれば、XAML に読み込むことで、実行中のアプリのコンテンツを簡単に変更できます。So long as the property is an appropriate property in the content model that has eventual display capabilities and that will notify the execution engine that new content has been added into the app, you can modify a running app's contents easily by loading in XAML. .NET Framework の場合、この機能は通常、完全に信頼されたアプリケーションでのみ使用できます。これは、実行時にアプリケーションにファイルを読み込むことで、セキュリティ上の明らかな影響が発生するためです。For .NET Framework, this capability is generally only available in full-trust applications, because of the obvious security implications of loading files into applications as they run.

関連項目See also