質問

タイトルがすべてを物語っています。時々、そう思われることがあります Name そして x:Name 属性は交換可能です。

それでは、両者の決定的な違いは何でしょうか?また、一方を他方よりも使用する方が望ましいのはどのような場合でしょうか?

間違った方法で使用すると、パフォーマンスやメモリに影響はありますか?

役に立ちましたか?

解決

本当にXAML、x:Nameで唯一の名前があります。そのようなWPFのようなフレームワークは、必要に応じてXへのマッピングなどのクラスの中の一つを指定するクラスにx:Nameを使用して、XAMLのRuntimeNamePropertyAttributeにその特性のいずれかをマッピングすることができる:。XAMLのName属性

これが行われた理由は、WPFのように、既に実行時に「名前」の概念を持っているフレームワーク、を可能にすることでした。 WPFでは、例えば、FrameworkElementは、Nameプロパティを紹介します。

x:Nameが使用可能であるためには、

一般的には、クラスが名前を保存する必要はありません。すべてのx:Nameは、XAMLは、クラスの背後にあるコードに値を格納するフィールドを生成するための手段です。どのようなランタイムは、そのマッピングを行うことは、フレームワークに依存します。

それでは、なぜ同じことを行うには、2つの方法がありますか? 1つのプロパティにマッピングされた二つの概念があるので、簡単な答えはあります。 WPFは、(とりわけ、バインドによって使用可能である)、実行時に保存要素の名前を望んでいるとXAMLを使用して、クラスの背後にあるコードのフィールドでアクセスできるようにしたいものを要素を知る必要があります。 WPFは、xの別名としてNameプロパティをマーキングすることによって一緒にこれら二つを結びつける:名

将来的には、XAMLは、xのためのより多くの用途があります:名前は、そのような名前で、他のオブジェクトを参照してプロパティを設定することができますように、しかし3.5およびそれ以前では、フィールドを作成するためにのみ使用されます。

あなたがいずれかを使用する必要がありますか、他のは本当にスタイルの問題ではなく、技術的なものであるかどうか。私は勧告のために他の人にそのままになります。

名前に、AutomationProperties.Nameは、アクセシビリティで使用されます。

AutomationProperties.Name X VSも参照してください。ツールといくつかのテストツールます。

他のヒント

これらは同じものではありません。

x:Name要素を参照するために主に使用されるXAMLの概念です。あなたが要素にX与えるとき:名前XAML属性を、「指定x:Nameは、XAMLが処理されるときに基礎となるコードで作成されたフィールドの名前になり、そのフィールドは、オブジェクトへの参照を保持しています。」 ( MSDN の)だから、それはですデフォルトでは、内部アクセスを持っているデザイナーで生成されたフィールド、ます。

Nameは、XAML属性の形で他のWPF要素のプロパティとしてリストされ、FrameworkElementの既存の文字列プロパティである。

その結果、これはまたx:Nameオブジェクトの広い範囲で使用することができることを意味します。これは、指定した名前で参照されるようにXAMLで何かを可能にする技術である。

x:Name と Name は異なる名前空間を参照しています。

x:名前 は、Xaml ファイルの先頭にデフォルトで定義されている x 名前空間への参照です。

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

ただ言って 名前 以下のデフォルトの名前空間を使用します。

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

x:名前 を持つ名前空間を使用すると言っています バツ エイリアス。x がデフォルトで、ほとんどの人はそのままにしますが、好きなものに変更できます。

xmlns:foo="http://schemas.microsoft.com/winfx/2006/xaml"

したがって、あなたの参照は foo:名前

WPF での名前空間の定義と使用


OK、これを別の方法で見てみましょう。ボタンを Xaml ページにドラッグ アンド ドロップするとします。これは2つの方法で参照できます x:名前 そして 名前. 。全て xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" そして xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" are は複数の名前空間への参照です。以来 xaml を保持します コントロール 名前空間(100%ではありません)と プレゼンテーション を保持します フレームワーク要素 そしてその ボタンクラス 次の継承パターンがあります。

Button : ButtonBase
ButtonBase : ContentControl, ICommandSource
ContentControl : Control, IAddChild
Control : FrameworkElement
FrameworkElement : UIElement, IFrameworkInputElement, 
                    IInputElement, ISupportInitialize, IHaveResources

したがって、ご想像のとおり、FrameworkElement から継承するものはすべて、そのすべてのパブリック属性にアクセスできます。そのため、Button の場合は、階層ツリーの最上部にある FrameworkElement から Name 属性を取得します。 それで あなたは言うことができます x:名前 または 名前 そして、両方とも FrameworkElement から getter/setter にアクセスします。

MSDN リファレンス

WPF は、複数の CLR 名前空間を単一の XML 名前空間にマップするために、XAML プロセッサによって使用される CLR 属性を定義します。の XmlnsDefinitionAttribute 属性は、アセンブリを生成するソース コードのアセンブリ レベルに配置されます。WPF アセンブリ ソース コードは、この属性を使用して、System.Windows や System.Windows.Controls などのさまざまな共通名前空間を http://schemas.microsoft.com/winfx/2006/xaml/presentation 名前空間。

したがって、アセンブリ属性は次のようになります。

PresentationFramework.dll - XmlnsDefinitionAttribute:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Data")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Navigation")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Shapes")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Documents")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Controls")]  

これらはどちらも同じものです。多くのフレームワーク要素はそれ自体 name プロパティを公開しますが、そうでない要素については x:name を使用できます。私は通常、すべてに機能する x:name を使用します。

コントロールは、必要に応じて名前自体を依存関係プロパティとして公開できます (その依存関係プロパティを内部で使用する必要があるため)。あるいは、公開しないことも選択できます。

詳細についてはmsdnをご覧ください ここ そして ここ:

一部の WPF フレームワーク レベルのアプリケーション の使用を回避できる可能性があります。 x:Name 属性を使用します。 dependency プロパティが指定されている いくつかの WPF 名前空間内で 次のような重要な基底クラス FrameworkElement/FrameworkContentElement (英語) これと同じ目的を満たします。があります まだいくつかの一般的なXAMLとフレームワーク コードが 要素に Name プロパティがない場合は、 必要で、特に特定の アニメーションと絵コンテのサポート クラス。たとえば、 タイムラインで x:Name を指定し、 XAML で作成された変換 ( コードからそれらを参照するつもりです。

Name が クラス、Name、x:Name を使用できます 属性と同じ意味ですが、 両方が 同じ要素に指定されています。

X:あなたはカスタムコントロールを持っている場合、名前はメモリの問題を引き起こす可能性があります。これは、NameScopeのエントリのメモリ位置を維持します。

私は、x使用することはありませんと言う:。名前をあなたがする必要がある場合を除き、

唯一の違いは、あなたがして名前があなたのコントロールを識別しません同じアセンブリからのコントロールにユーザーコントロールを使用していて、エラーを取得する場合は、「:同じアセンブリ内のコントロールの名前ですX使用する」ということです。 だから、X:名前はWPFのコントロールの名前付けのWPFのバージョンがあります。名前だけでWinフォームレガシーとして使用されています。コントロールの名前のため:彼らは、彼らはXを使用し他のアセンブリからコントロールを識別するために、XAMLで属性を使用してWPFとリサイズのコントロールの命名を区別したかったです。

ただ、ちょうどそれが空白としてメモリに常駐するようにそれを維持するためにコントロールの名前を入れて心に留めていけない維持し、それはあなたの名前が使用されることはありません言い訳制御に適用されている警告を与えます。

名前:

  1. FrameworkElement と FrameworkContentElement の子孫にのみ使用できます。
  2. コードビハインドから SetValue() を介してプロパティのように設定できます。

x:名前:

  1. ほぼすべての XAML 要素に使用できます。
  2. からは設定できません。 SetValue()による分離コード。属性を使用してのみ設定できます オブジェクトの構文は、ディレクティブであるためです。

1 つの FrameworkElement または FrameworkContentElement に対して XAML で両方のディレクティブを使用すると、例外が発生します。XAML がマークアップ コンパイルされている場合、例外はマークアップ コンパイル時に発生します。そうでない場合は、読み込み時に例外が発生します。

x:Name手段:このオブジェクトへの参照を保持するの背後にあるコードのフィールドを作成する

Nameは意味:このオブジェクトのnameプロパティを設定する

名前のバリアント:

私はいつもXを使用しています。 これは、パフォーマンスに影響を与える場合、私はちょうど次の理由のため、それが簡単に見つけ、見当がつかない。 あなたが別のアセンブリ内に存在し、独自のユーザーコントロールを持っている場合は、単に「名前」プロパティは常に十分ではありません。これは、それが簡単にあまりにもX固執することができます:。Nameプロパティを

これは、WPFのアイテムが、標準XMLではないですし、 BtBh のが正しく、それに答えた、xはデフォルトの名前空間を参照します。名前空間を持つ要素/属性の接頭辞いないXMLで、それはあなたがデフォルトの名前空間が欲しい想定しています。 だからNameを入力すると、x:Nameための短い手以外の何ものでもありません。 XML名前空間についての詳細は、リンクテキスト

で見つけることができます
名前は、C#や名前などの異なるプログラム言語内で使用されるフレームワークのために使用される:

の回答の一つは、xはことです。正直なところ、それはそれは私にように聞こえるものです。

XAMLでボタン要素を宣言するときは、

は、Windowsの実行時間と呼ばれるボタンで定義されたクラスを参照されます。

ボタンは、このような背景、テキスト、マージン、.....と属性と呼ばれる名前など、多くの属性を持っています。

あなたはXAMLでボタンを宣言するときに

さて名という属性を持つことが起こった匿名のオブジェクトを作成するようなものです。

一般的に、あなたは匿名のオブジェクトを参照することはできませんが、WPFフレームワークXAMLプロセッサでは、あなたが名前属性に与えているどのような値で、そのオブジェクトを参照することができます。

これまでのところは良い。

オブジェクトを作成するための別の方法ではなく、匿名オブジェクトの名前付きオブジェクトを作成することです。この場合のXAML名前空間ではオブジェクトと呼ばれる名前の属性を持っている(と、それはXAML名前空間であるため、このようにあなたがあなたのオブジェクトを識別し、それを参照することができますので、設定してX :)を持っています。

結論ます:

の名前は、特定のオブジェクトの属性であるが、X:名前は、そのオブジェクトの一の属性である(一般的なオブジェクトを定義するクラスがある)

指定の X:名のXAMLが処理され、そのフィールドは、オブジェクトへの参照を保持している場合、基礎となるコードで作成されたフィールドの名前となります。 Silverlightのでは、管理APIを使用して、このフィールドを作成するプロセスは、XAMLファイルとそのコードビハインドのための部分的なクラスに参加するための責任があるのMSBuildターゲット手順によって行われます。この動作は、必ずしもXAML言語が指定されていません。それは、Silverlightを使用するように適用されることの X特定の実装である:そのプログラミングとアプリケーションモデルで名前

<... MSDN上の続きを読みます/>

私の研究は、<私>グローバルの変数としてx:Nameされます。しかし、<私>ローカルの変数としてName。その平均値は、xん:あなたはあなたのXAMLファイルの任意の場所にそれを呼び出すことができますが、名前がされていない名前
。 例:

<StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
<Button Content="Example" Name="btn" />
</StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />

あなたは名でBindingのプロパティContentButtonすることはできませんので外StackPanel

"BTN" であります
scroll top