24

違いは何ですか:

<Style TargetType="{x:Type Border}">

と:

<Style TargetType="Border">

いつ、なぜ使用する必要があるの{x:Type …}ですか?

4

5 に答える 5

15

効果に違いはありません。どちらの場合も、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ネイティブプロパティ評価に組み込まれています。

于 2012-06-23T06:59:19.143 に答える
6

与えられた例では違いはありませんが、実際には と の間に違いが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 TypeExtensionTypeName-as-String FrameworkElementFactory

于 2012-06-23T08:18:35.103 に答える
2

TargetTypeでスタイルを割り当てずにこのプロパティ ( ) を Border に設定すると、x:Keyそのスタイルをすべての Border 要素に適用できます。しかし、 を に設定するx:Key{x:Type Border}、これは、に 以外Styleの値を指定すると、すべての Border 要素に自動的に適用されないことを意味します。代わりに、スタイルを Border 要素に明示的に適用する必要があります。x:Key{x:Type Border}Style

于 2012-06-23T07:09:54.817 に答える
1

どちらもまったく同じです。どちらの場合でも、あなたのスタイルはにBorderのみ適用されます。

于 2012-06-23T07:00:58.563 に答える
0

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 マークアップ拡張は、冗長属性としても使用できます。ただし、この使用法は一般的ではありません。

于 2012-06-23T09:36:44.830 に答える