634

Nameとのx:Name属性が交換可能であるように見える場合があります。

では、それらの決定的な違いは何ですか。

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

4

15 に答える 15

510

XAML には、実際にはx:Name. WPF などのフレームワークは、XAML のx:Name 属性へのマッピングとしてクラス プロパティの 1 つを指定するクラスでx:Nameを使用することにより、必要に応じてそのプロパティの 1 つを XAML にマップできます。RuntimeNamePropertyAttribute

これが行われた理由は、WPF など、実行時に "名前" の概念を既に持っているフレームワークを許可するためでした。たとえば、WPF ではFrameworkElementName プロパティが導入されています。

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

では、なぜ同じことを行うのに 2 つの方法があるのでしょうか。簡単な答えは、2 つの概念が 1 つのプロパティにマッピングされているためです。WPF は実行時に保持される要素の名前 (特に Bind を介して使用可能) を必要とし、XAML はコード ビハインド クラスのフィールドからどの要素にアクセスできるようにするかを知る必要があります。WPF は、Name プロパティを x:Name のエイリアスとしてマークすることで、これら 2 つを結び付けます。

将来的には、XAML で x:Name の用途が増える予定です。たとえば、他のオブジェクトを名前で参照してプロパティを設定できるようになりますが、3.5 以前では、フィールドの作成にのみ使用されていました。

どちらを使用するかは、技術的な問題ではなく、スタイルの問題です。推薦は他の方にお任せします。

AutomationProperties.Name VS x:Nameも参照してください。AutomationProperties.Name は、アクセシビリティ ツールと一部のテスト ツールで使用されます。

于 2009-02-27T00:52:49.170 に答える
46

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

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

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

Nameと言うだけで、名前空間の下のデフォルトが使用されます。

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

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

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

したがって、参照はfoo:nameになります

WPF で名前空間を定義して使用する


OK、これを別の方法で見てみましょう。ボタンを Xaml ページにドラッグ アンド ドロップするとします。これはx:namenameの2 つの方法で参照できます。すべてのxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" および xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"は、複数の名前空間への参照です。 . xamlControl名前空間 (100% ではない) を保持し、プレゼンテーションはFrameworkElementを保持し、Button クラスには次の継承パターンがあるため:

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

そのため、FrameworkElement から継承するものはすべて、そのすべてのパブリック属性にアクセスできると予想されます。したがって、ボタンの場合、階層ツリーの最上部にある FrameworkElement から Name 属性を取得します。 したがって、 x:NameまたはNameと言うことができ、どちらも 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")]  
于 2009-02-26T10:36:02.990 に答える
28

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

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

ここここのmsdnの詳細:

一部の WPF フレームワーク レベルのアプリケーションでは、x:Name 属性の使用を回避できる場合があります。これは、FrameworkElement/FrameworkContentElement などのいくつかの重要な基本クラスの WPF 名前空間内で指定されている Name 依存関係プロパティが、この同じ目的を満たしているためです。Name プロパティを持たない要素へのコード アクセスが必要な一般的な XAML およびフレームワークのシナリオがいくつかあります。特に、特定のアニメーションおよびストーリーボード サポート クラスで顕著です。たとえば、XAML で作成されたタイムラインと変換をコードから参照する場合は、x:Name を指定する必要があります。

クラスのプロパティとして Name を使用できる場合、Name と x:Name を属性として同じ意味で使用できますが、両方を同じ要素に指定するとエラーが発生します。

于 2009-02-26T10:03:51.210 に答える
13

カスタム コントロールがある場合、X:Name によってメモリの問題が発生する可能性があります。NameScope エントリのメモリ ロケーションを保持します。

必要がない限り、決して x:Name を使用しないでください。

于 2011-01-13T18:57:33.587 に答える
8

唯一の違いは、同じアセンブリからのコントロールにユーザー コントロールを使用している場合、名前はコントロールを識別せず、「同じアセンブリ内のコントロールには x:Name を使用してください」というエラーが表示されることです。したがって、x:Name は、WPF の名前付けコントロールの WPF バージョン管理です。名前は Winform Legacy として使用されるだけです。Xaml の属性を使用して、コントロールの名前に x: を使用した他のアセンブリからコントロールを識別するため、WPF と winform でコントロールの名前を区別したいと考えていました。

名前がコントロールに適用されているが使用されていないという警告が表示されるため、コントロールを空白としてメモリに保持するためだけに名前を付けないでください。

于 2013-01-17T18:03:57.747 に答える
7

x:Name意味: このオブジェクトへの参照を保持するためにコード ビハインドにフィールドを作成します。

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

于 2015-01-20T13:04:52.340 に答える
4

私は常に x:Name バリアントを使用します。これがパフォーマンスに影響するかどうかはわかりませんが、次の理由で簡単だと思います. 別のアセンブリに存在する独自のユーザー コントロールがある場合、"Name" プロパティだけでは必ずしも十分ではありません。これにより、x:Name プロパティに固執しやすくなります。

于 2009-02-26T09:56:56.313 に答える
3

これはWPFアイテムではなく、標準のXMLアイテムであり、BtBhが正しく応答しました。xはデフォルトの名前空間を指します。XMLでは、要素/属性の前に名前空間を付けない場合、デフォルトの名前空間が必要であると想定されます。したがって、入力するNameことは、の省略形にすぎませんx:Name。XML名前空間の詳細については、リンクテキストを参照してください。

于 2009-02-26T11:35:07.090 に答える
2

XAML で Button 要素を宣言するときは、Windows ランタイムで定義された Button というクラスを参照しています。

ボタンには、背景、テキスト、余白などの多くの属性と、名前と呼ばれる属性があります。

XAML で Button を宣言することは、たまたま Name という属性を持つ匿名オブジェクトを作成するようなものです。

通常、匿名オブジェクトを参照することはできませんが、WPF フレームワークでは、XAML プロセッサを使用すると、Name 属性に指定した値によってそのオブジェクトを参照できます。

ここまでは順調ですね。

オブジェクトを作成するもう 1 つの方法は、無名オブジェクトの代わりに名前付きオブジェクトを作成することです。この場合、XAML 名前空間には、オブジェクトを識別して参照できるように設定できる Name というオブジェクトの属性があります (XAML 名前空間にあるため、X: があります)。

結論:

Name は特定のオブジェクトの属性ですが、X:Name はそのオブジェクトの 1 つの属性です (一般的なオブジェクトを定義するクラスがあります)。

于 2015-08-24T01:36:31.103 に答える
1

答えの 1 つは、x:name を c# などのさまざまなプログラム言語内で使用し、name をフレームワークで使用することです。正直なところ、私にはそう聞こえます。

于 2013-11-15T05:49:48.593 に答える