2009-09-04 17 views
26

WPF UserControlを作成して使用しようとすると、次のコンパイラエラーが発生しました。同じアセンブリ内でUserControlのName属性を使用できないのはなぜですか?

Because 'UserControl1' is implemented in the same assembly, you must set the x:Name attribute rather than the Name attribute.

メッセージは修正するために何をすべきかはっきりしていますが、その原因は何ですか? なぜNameを使用できないのですか?

答えて

29

x:名前は、単に「この特定のXML名前空間の名前属性」というより明示的な方法です。同じアセンブリ内にあるため、このヒントが与えられずにWPFでコンパイルできないという事実は、パーサの書き方の制限に過ぎません。

私はそれを書いていないので、なぜこのようになっているのか分かりません。おそらく、それはあなたのUserControl1を構築する前に、何か具体的にName属性(read:Dependency Property)を解決できる必要がある、つまりcatch-22と何か関係があります。

7

最初に.netオブジェクトの "ツリー"を作成できるようにXAMLコンパイラが作成されました.XAMLを使用したMicrosoftでは101のプロジェクトがありました。 XAMLコンパイラはWPFについて何も知らない。

"名前"プロパティはWPFで定義されており、XAMLコンパイラでは知られていません。 WPFはnameプロパティをXAMLコンパイラでサポートされている "Name TAG"と同じにマップします。 "x:name"の "x"は、XAML xmlスキーマで定義されている "name"を使用しています。 "Name"は、指定されたオブジェクトの "name"というプロパティを検索します。詳細はIn WPF, what are the differences between the x:Name and Name attributes?を参照してください。

XAMLコンパイラは、ユーザーコントロールを定義するアセンブリを読み込まなくても、ユーザーコントロールでできることは非常に限られています。アセンブリをロードする前にXAMLをコンパイルする必要があるため、xamlコンパイラは、同じアセンブリに実装されているコントロールのアセンブリを読み込むことはできません。したがって、XAMLコンパイラは、その項目がユーザーコントロールであることさえ知りません。

Properties that are defined on a user control (or its parent class) can therefore not be accessed. “Name” is a property that is defined in the parent (or super-parent) of a custom control.

XAMLコンパイラは「名前はプロパティとして定義されていません」と言うことができます。もしそうであれば、何人の人々が簡単なカスタムコントロールの作業に失敗するか考えてみてください!したがって、XAMLコンパイラには、コードが意味するものを「推測」することにより、より有用なエラーメッセージを出す特殊なケースがあります。その推測は大抵正しいです。

最もシンプルなユーザーコントロール以外のものは、それ自身のアセンブリにする必要がありますが、ユーザーの単純なコントロールは非常に一般的であり、特別なケースが価値のあるものと考えられていました。

+2

'したがって、ユーザーコントロール(またはその親クラス)で定義されたプロパティにアクセスすることはできません。 - それは私には意味がない。基本クラスで定義されている他のプロパティを設定すると、 ''が動作するので、コンパイラは 'Name' WPFプロパティの値を同じ方法 – nevermind

関連する問題