違いは何ですか:
<Style TargetType="{x:Type Border}">
と:
<Style TargetType="Border">
いつ、なぜ使用する必要があるの{x:Type …}
ですか?
違いは何ですか:
<Style TargetType="{x:Type Border}">
と:
<Style TargetType="Border">
いつ、なぜ使用する必要があるの{x:Type …}
ですか?
効果に違いはありません。どちらの場合も、TargetTypeプロパティはに設定されますtypeof(Border)
{x:Type Border}
WPFの最初のバージョンでは、コンパイラがTypeConverter
文字列をTypeオブジェクトに変換するためにクラスを使用せず、それを行うためにクラスを指定する必要があったため、最初のバージョンが必要でしたTypeExtension
。
2番目のバージョンは、私が正しく覚えていれば、Silverlightで導入され、すぐにWPFコンパイラへの道を見つけました。
編集
TypeConverter
クラスに関する私の仮定は間違っていました。これは:によって実装されFrameworkElementFactory
ます
ドキュメントから:
Typename-as-Stringをサポートするタイププロパティ
WPFは、x:Typeマークアップ拡張機能を使用せずに、Type型の一部のプロパティの値を指定できるようにする手法をサポートしています。代わりに、タイプに名前を付ける文字列として値を指定できます。この例は、ControlTemplate.TargetTypeおよびStyle.TargetTypeです。この動作のサポートは、タイプコンバーターまたはマークアップ拡張機能のいずれでも提供されません。代わりに、これはFrameworkElementFactoryを介して実装された延期動作です。
Silverlightは同様の規則をサポートしています。実際、Silverlightは現在XAML言語サポートで{x:Type}をサポートしておらず、WPF-Silverlight XAML移行をサポートすることを目的としたいくつかの状況以外では{x:Type}の使用を受け入れません。したがって、typename-as-string動作は、Typeが値であるすべてのSilverlightネイティブプロパティ評価に組み込まれています。
与えられた例では違いはありませんが、実際には と の間に違いがx:Type
ありTypeName-as-String
ます。
最近、カスタム型とx:Type
は異なる状況に遭遇しました。TypeName-as-String
私の経験から -
x:Type
アセンブリの厳密な名前またはバージョン (型が存在する) は考慮されますが、 は考慮されませんTypeName-as-String
。
私のシナリオとその他の詳細については、こちらのブログで説明しています -
RelativeSourceBinding の x:Type で AncestorType を指定することの重要性
これとは別に、WPF が型を推測する方法にも違いがあります。forが使用されますが、 forが使用されます (Erno が述べたように)。x:Type
TypeExtension
TypeName-as-String
FrameworkElementFactory
TargetType
でスタイルを割り当てずにこのプロパティ ( ) を Border に設定すると、x:Key
そのスタイルをすべての Border 要素に適用できます。しかし、 を に設定するx:Key
と{x:Type Border}
、これは、に 以外Style
の値を指定すると、すべての Border 要素に自動的に適用されないことを意味します。代わりに、スタイルを Border 要素に明示的に適用する必要があります。x:Key
{x:Type Border}
Style
どちらもまったく同じです。どちらの場合でも、あなたのスタイルはにBorder
のみ適用されます。
XAML 2009 を使用している場合は、x:Key を要素として指定して、マークアップ拡張中間体を必要とせずに、文字列以外のオブジェクト型をキーとする辞書を明示的にサポートできます。このトピックの「XAML 2009」セクションを参照してください。備考セクションの残りの部分は、特に XAML 2006 実装に適用されます。
x:Key の属性値は、XamlName Grammar で定義された任意の文字列にするか、マークアップ拡張によって評価されるオブジェクトにすることができます。WPF の例については、「WPF の使用上の注意」を参照してください。
IDictionary 実装である親要素の子要素には、通常、その辞書内で一意のキー値を指定する x:Key 属性を含める必要があります。フレームワークは、特定の型の x:Key を置き換えるためにエイリアス化されたキー プロパティを実装する場合があります。そのようなプロパティを定義する型は、DictionaryKeyPropertyAttribute で属性付けする必要があります。
x:Key を指定するのと同等のコードは、基になる IDictionary に使用されるキーです。たとえば、WPF のリソースのマークアップに適用される x:Key は、リソースをコードで WPF ResourceDictionary に追加する場合の ResourceDictionary.Add のキー パラメーターの値と同等です。x:Type マークアップ拡張には、C# の typeof() 演算子または Microsoft Visual Basic の GetType 演算子と同様の機能があります。
x:Type マークアップ拡張機能は、Type 型を取るプロパティの文字列からの変換動作を提供します。入力は XAML 型です。入力 XAML 型と出力 CLR 型の関係は、XAML スキーマ コンテキストとコンテキストが提供する IXamlTypeResolver サービスに基づいて必要な XamlType を検索した後、出力 Type が入力 XamlType の UnderlyingType であるということです。
.NET Framework XAML サービスでは、このマークアップ拡張機能の処理は TypeExtension クラスによって定義されます。
特定のフレームワークの実装では、Type を値として受け取る一部のプロパティは、型の名前 (型 Name の文字列値) を直接受け入れることができます。ただし、この動作の実装は複雑なシナリオです。例については、次の「WPF 使用上の注意」セクションを参照してください。
属性構文は、このマークアップ拡張で使用される最も一般的な構文です。x:Type 識別子文字列の後に指定された文字列トークンは、基になる TypeExtension 拡張クラスの TypeName 値として割り当てられます。CLR 型に基づく .NET Framework XAML サービスの既定の XAML スキーマ コンテキストでは、この属性の値は目的の型の Name であるか、既定以外の XAML 名前空間マッピングのプレフィックスが前に付いた Name を含みます。 .
x:Type マークアップ拡張は、オブジェクト要素構文で使用できます。この場合、拡張機能を適切に初期化するには、TypeName プロパティの値を指定する必要があります。
x:Type マークアップ拡張は、冗長属性としても使用できます。ただし、この使用法は一般的ではありません。