タイトルはそれをすべて言います。Name
とx:Name
属性は互換性があるように見えることがあります。
それで、それらの間の決定的な違いは何ですか、そしていつ他のものを使用することが望ましいですか?
それらを間違った方法で使用することによるパフォーマンスやメモリへの影響はありますか?
タイトルはそれをすべて言います。Name
とx:Name
属性は互換性があるように見えることがあります。
それで、それらの間の決定的な違いは何ですか、そしていつ他のものを使用することが望ましいですか?
それらを間違った方法で使用することによるパフォーマンスやメモリへの影響はありますか?
回答:
XAMLに実際に存在する名前は1つだけx:Name
です。WPFなどのフレームワークは、オプションで、クラスのプロパティの1つをXAMLのx:Name属性へのマッピングとして指定するクラスのをx:Name
使用しRuntimeNamePropertyAttribute
て、そのプロパティの1つをXAMLにマップできます。
これが行われた理由は、WPFなど、実行時に「名前」の概念がすでにあるフレームワークを許可するためです。たとえばWPFではFrameworkElement
、Nameプロパティが導入されています。
一般に、クラスはx:Name
使用可能になるために名前を格納する必要はありません。x:Name
XAMLのすべての手段は、コードビハインドクラスに値を格納するフィールドを生成することです。ランタイムがそのマッピングで行うことはフレームワークに依存します。
それで、同じことをする2つの方法があるのはなぜですか?簡単な答えは、1つのプロパティに2つの概念がマッピングされているためです。WPFは、実行時に保持される要素の名前(特にBindを介して使用可能)を必要とし、XAMLは、コードビハインドクラスのフィールドでアクセスできるようにする要素を認識する必要があります。WPFは、Nameプロパティをx:Nameのエイリアスとしてマークすることにより、これら2つを結び付けます。
将来的には、XAMLは他のオブジェクトを名前で参照してプロパティを設定できるようになるなど、x:Nameの用途が増えるでしょうが、3.5以前では、フィールドの作成にのみ使用されます。
どちらを使用するかは、実際にはスタイルの問題であり、技術的な問題ではありません。私は推薦のためにそれを他の人に任せます。
AutomationProperties.Name VS x:Nameも参照してください。AutomationProperties.Nameは、ユーザー補助ツールと一部のテストツールで使用されます。
x:Name
ので、Name
コードビハインドで認識されるフィールドを作成しないでしょう。しかし、なぜこれが起こるのかはまだわかりません。
Name
プロパティがある場合、それらは同じことを意味します。要素にName
プロパティがない場合は、を使用する必要がありますx:Name
。
彼らは同じものではありません。
x:Name
xamlの概念であり、主に要素の参照に使用されます。要素にx:Name xaml属性を指定するx:Name
と、「指定されたものは、xamlが処理されるときに基になるコードで作成されるフィールドの名前になり、そのフィールドはオブジェクトへの参照を保持します。」(MSDN)つまり、これはデザイナーが生成したフィールドであり、デフォルトで内部アクセス権を持っています。
Name
の既存の文字列プロパティFrameworkElement
で、xaml属性の形式で他のwpf要素プロパティとしてリストされます。
結果として、これx:Name
はより広い範囲のオブジェクトで使用できることも意味します。これは、xaml内の任意のものを特定の名前で参照できるようにする手法です。
x:NameとNameは異なる名前空間を参照しています。
x:nameは、Xamlファイルの上部にデフォルトで定義されているx名前空間への参照です。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
名前を言うだけで、以下の名前空間のデフォルトが使用されます。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
x:Nameは、xエイリアスを持つ名前空間を使用すると言っています。xがデフォルトで、ほとんどの人はそのままにしますが、好きなように変更できます
xmlns:foo="http://schemas.microsoft.com/winfx/2006/xaml"
したがって、参照はfoo:nameになります
では、これを別の方法で見てみましょう。ボタンをXamlページにドラッグアンドドロップするとします。これは、x:nameとnameの 2つの方法で参照できます。すべてのxmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" および xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"は、複数の名前空間への参照です。以来、XAMLは、保持しているコントロールの名前空間(つまりオンになっていない100%)とプレゼンテーションが保持しているのFrameworkElementとButtonクラスがの遺伝パターンがあります。
Button : ButtonBase
ButtonBase : ContentControl, ICommandSource
ContentControl : Control, IAddChild
Control : FrameworkElement
FrameworkElement : UIElement, IFrameworkInputElement,
IInputElement, ISupportInitialize, IHaveResources
したがって、FrameworkElementから継承するものはすべて、そのすべてのパブリック属性にアクセスできます。したがって、Buttonの場合、階層ツリーの最上部にあるFrameworkElementからName属性を取得しています。 したがって、x:NameまたはNameと言うと、どちらもFrameworkElementからゲッター/セッターにアクセスします。
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")]
http://schemas.microsoft.com/winfx/2006/xaml
保持しているControl
:あなたは「X」名前空間なしで直接XAMLでそれを使用することができますので、<Control />
それらは両方とも同じものであり、多くのフレームワーク要素はそれ自体で名前プロパティを公開しますが、それができない場合はx:nameを使用できます。
コントロールは、必要に応じて(Dependencyプロパティを内部で使用する必要があるため)必要に応じて、自身をDependencyプロパティとして公開するか、またはそうしないことを選択できます。
一部のWPFフレームワークレベルのアプリケーションでは、x:Name属性の使用を回避できる場合があります。FrameworkElement/ FrameworkContentElementなどのいくつかの重要な基本クラスのWPF名前空間内で指定されたName依存プロパティは、この同じ目的を満たすためです。まだいくつかの一般的なXAMLおよびフレームワークシナリオがあり、Nameプロパティのない要素へのコードアクセスが必要です(特に、特定のアニメーションおよびストーリーボードサポートクラス)。たとえば、コードから参照する場合は、XAMLで作成されたタイムラインと変換でx:Nameを指定する必要があります。
Nameがクラスのプロパティとして利用できる場合、Nameとx:Nameは属性として交換可能に使用できますが、両方が同じ要素で指定されている場合はエラーが発生します。
カスタムコントロールがある場合、X:Nameはメモリの問題を引き起こす可能性があります。NameScopeエントリのメモリ位置を保持します。
必要がない限り、x:Nameは使用しないでください。
FrameworkElement.RegisterName("elementname")
FrameworkElement.UnregisterName("elementname")
唯一の違いは、ユーザーコントロールを同じアセンブリのコントロールに使用している場合、名前はコントロールを識別せず、「同じアセンブリのコントロールにx:Nameを使用する」というエラーが発生することです。つまり、x:NameはWPFの名前付けコントロールのWPFバージョン管理です。名前は、Winform Legacyとしてのみ使用されます。Xamlの属性を使用して、コントロールの名前にx:を使用した他のアセンブリからコントロールを識別するため、WPFとwinformsのコントロールの名前を区別する必要がありました。
空白としてメモリに常駐しているため、コントロールの名前を保持するためだけにコントロールに名前を付けないでください。名前がコントロールに適用されているが、使用されていないという警告が表示されます。
お名前:
x:名前:
1つのFrameworkElementまたはFrameworkContentElementに対してXAMLで両方のディレクティブを使用すると、例外が発生します。XAMLがマークアップコンパイルされている場合、例外はマークアップコンパイルで発生します。それ以外の場合は、ロード時に発生します。
私は常にx:Nameバリアントを使用します。これがパフォーマンスに影響するかどうかはわかりませんが、次の理由で簡単にわかります。別のアセンブリに常駐する独自のユーザーコントロールがある場合、「名前」プロパティだけでは必ずしも十分ではありません。これにより、x:Nameプロパティも固定することが簡単になります。
これはWPFアイテムではありませんが、標準のXMLアイテムであり、BtBhが正しく回答しています。xはデフォルトの名前空間を指します。XMLでは、要素/属性の前に名前空間を付けないと、デフォルトの名前空間が必要であると見なされます。つまり、タイピングName
はの省略形にすぎませんx:Name
。XML名前空間の詳細については、リンクテキストを参照してください。
指定されたx:Nameは、XAMLが処理されるときに基になるコードで作成されるフィールドの名前になり、そのフィールドはオブジェクトへの参照を保持します。Silverlightでは、マネージAPIを使用して、このフィールドを作成するプロセスはMSBuildターゲットステップによって実行されます。MSBuildターゲットステップは、XAMLファイルの部分クラスとそのコードビハインドを結合する役割も果たします。この動作は必ずしもXAML言語で指定されているとは限りません。これは、プログラミングモデルとアプリケーションモデルでx:Nameを使用するためにSilverlightが適用する特定の実装です。
XAMLでButton要素を宣言するときは、Buttonと呼ばれるWindowsランタイムで定義されたクラスを参照しています。
ボタンには、背景、テキスト、マージンなどの多くの属性と、名前と呼ばれる属性があります。
XAMLでボタンを宣言すると、たまたまNameという属性を持つ匿名オブジェクトが作成されます。
一般に、匿名オブジェクトを参照することはできませんが、WPFフレームワークでは、XAMLプロセッサを使用すると、Name属性に指定した値でそのオブジェクトを参照できます。
ここまでは順調ですね。
オブジェクトを作成する別の方法は、匿名オブジェクトの代わりに名前付きオブジェクトを作成することです。この場合、XAML名前空間にはNameというオブジェクトの属性があり(XAML名前空間にあるため、X:があるため)、オブジェクトを識別して参照できるように設定できます。
結論:
Nameは特定のオブジェクトの属性ですが、X:Nameはそのオブジェクトの1つの属性です(一般的なオブジェクトを定義するクラスがあります)。
私の研究はあるx:Name
としてグローバル変数。ただし、ローカル変数Name
として。つまり、x:NameはXAMLファイル内の任意の場所で呼び出すことができますが、Nameはそうではありません。
例:
<StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
<Button Content="Example" Name="btn" />
</StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
Nameが "btn"のBinding
プロパティContent
はできませんButton
StackPanel
x:Name
すべての時間を使用して問題なく動作することを示唆しています。Name
それを変更する必要がありましたが、それ以外の場合は.xaml.csコードでコントロールを参照できなかったので、常に正常に機能しているとは限りません。