WPF에서 x : Name과 Name 특성의 차이점은 무엇입니까?


573

제목이 다 나와 있습니다. 때로는 속성 Namex:Name속성이 서로 호환 되는 것 같습니다 .

그래서, 그들 사이의 결정적인 차이점은 무엇이며, 언제 다른 것을 사용하는 것이 바람직합니까?

잘못된 방식으로 사용하면 성능이나 메모리에 영향이 있습니까?


응답은 x:Name항상 사용 하는 것이 좋습니다 . 방금 변경해야했습니다. Name그렇지 않으면 .xaml.cs 코드에서 컨트롤을 참조 할 수 없으므로 더 이상 항상 잘 작동한다고 가정합니다.
Ortund

1
롤백과 관련하여 "타이틀에서 모든 것을 말합니다"라는 문구가 추가로 의미하는 것은 무엇입니까, Drew? 중복되지 않습니까? (편집의 나의 이유는 대화 필러 문구를 사용하지 않는 경향이 있기 때문입니다. "도움이 있는지 궁금합니다"보다 더 유익하지는 않습니다.
절반

답변:


481

XAML에는 실제로 하나의 이름 만 있습니다 x:Name. WPF와 같은 프레임 워크 는 클래스 속성 중 하나를 XAML의 x : Name 특성에 대한 매핑으로 지정하는 클래스를 x:Name사용하여 해당 속성 중 하나를 XAML에 선택적으로 매핑 할 수 있습니다 RuntimeNamePropertyAttribute.

이것이 수행 된 이유는 WPF와 같이 런타임시 이미 "이름"이라는 개념을 가진 프레임 워크를 허용하기위한 것입니다. 예를 들어 WPF에서 FrameworkElementName 속성이 도입되었습니다.

일반적으로 클래스는 x:Name사용 하기 위해 이름을 저장할 필요가 없습니다 . x:NameXAML은 모든 클래스 뒤에 코드에 값을 저장하는 필드를 생성합니다. 런타임에서 해당 매핑으로 수행하는 작업은 프레임 워크에 따라 다릅니다.

그렇다면 왜 똑같은 일을하는 두 가지 방법이 있습니까? 간단한 대답은 하나의 속성에 두 개의 개념이 매핑되어 있기 때문입니다. WPF는 런타임에 보존 된 요소의 이름 (바인드를 통해 사용 가능)을 원하며 XAML은 클래스 뒤 코드의 필드에서 어떤 요소에 액세스 할 수 있는지 알고 있어야합니다. WPF는 Name 속성을 x : Name의 별칭으로 표시하여이 두 가지를 하나로 묶습니다.

앞으로 XAML은 이름으로 다른 객체를 참조하여 속성을 설정할 수 있도록하는 등 x : Name에 더 많은 용도를 갖게되지만 3.5 이전에는 필드를 만드는 데만 사용됩니다.

둘 중 하나를 사용해야하는지 여부는 기술적 인 문제가 아니라 스타일 문제입니다. 나는 추천을 위해 다른 사람들에게 맡길 것입니다.

도 참조 AutomationProperties.Name VS는 X : 이름 , AutomationProperties.Name은 접근성 도구와 몇 가지 테스트 도구에 의해 사용된다.


2
Visual Studio 2010에서 디자이너를 통해 XAML을 편집하면 Name 속성이 x : Name이 아니라 설정됩니다. 마치 MS가 x : Name보다 Name을 사용하도록 권장하는 것처럼 보이므로 사실상의 표준이라고 생각합니다.
성운

11
나는 두 사람이 일반적으로 상호 교환 가능하다고 생각하지 않습니다. 코드 숨김에서 인식 할 필드를 만들지 x:Name않으므로 이름 지정 사용자 정의 컨트롤이 필요합니다 Name. 그래도 왜 이런 일이 발생하는지 모르겠습니다.
Libor

5
그들은 내가 한 것을 암시하지도 않습니다. WPF에서 요소에 Name속성이 있으면 같은 의미입니다. 요소에 Name속성 이 없으면 을 사용해야합니다 x:Name.
chuckj

90

그들은 같은 것이 아닙니다.

x:Name주로 요소를 참조하는 데 사용되는 xaml 개념입니다. 요소에 x : Name xaml 속성을 지정 x:Name하면 "지정된 코드는 xaml이 처리 될 때 기본 코드에서 작성되는 필드의 이름이되며 해당 필드는 오브젝트에 대한 참조를 보유합니다." ( MSDN ) 따라서 기본적으로 내부 액세스 권한이있는 디자이너 생성 필드입니다.

NameFrameworkElementxaml 속성의 형태로 다른 wpf 요소 속성으로 나열된 의 기존 문자열 속성입니다 .

결과적으로 이것은 x:Name더 넓은 범위의 물체에 사용될 수 있음을 의미 합니다. 이것은 xaml의 모든 것을 주어진 이름으로 참조 할 수있게하는 기술입니다.


6
그렇다면 왜 Name 또는 x : Name을 Binding.ElementName과 함께 사용할 수 있습니까? x : Name 속성은 생성 된 코드에서 필드 이름을 지정하는 데 사용될뿐만 아니라 런타임시 메타 데이터에서도 사용할 수있는 것 같습니다.
Drew Noakes

WinForms 편집기의 디자인 속성에서 필드 이름과 같은 생성 된 필드입니다. 속성 목록에 이름을 입력하면 필드 이름이됩니다. 이것은 같은 행동입니다. 물론 그것은 코드 뒤에 컴파일 된 내부 필드이기 때문에 런타임에 사용할 수 있습니다. Binding.ElementName은 xaml 편집기 "magic"인 두 경우를 확인합니다. x : Name 자체는 마법이 아닙니다.
Kenan EK

39

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 : Namex 별칭 이있는 네임 스페이스를 사용한다고 말합니다 . x는 기본값이며 대부분의 사람들은 그대로 두지 만 원하는대로 변경할 수 있습니다

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

따라서 참조는 foo : name입니다.

WPF에서 네임 스페이스 정의 및 사용


OK는 이것을 다른 방식으로 봅니다. Xaml 페이지로 단추를 끌어다 놓으십시오. 이 두 가지 방법으로 x : namename을 참조 할 수 있습니다 . 모든 xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns : x = "http://schemas.microsoft.com/winfx/2006/xaml" 은 여러 네임 스페이스에 대한 참조입니다. . 이후 XAML은 보류를 제어 (즉에 대한 100 %) 네임 스페이스를하고 발표는 보류를 FrameworkElement을 하고 버튼 클래스 의 상속 패턴을 가지고 :

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

따라서 FrameworkElement에서 상속 된 모든 항목은 모든 공용 속성에 액세스 할 수 있습니다. 따라서 Button의 경우 계층 구조 트리의 맨 위에있는 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")]  

1
나는 그 사실 생각하지 않는다 http://schemas.microsoft.com/winfx/2006/xaml보유 Control: 당신이 'X'네임 스페이스 않고 직접 XAML에서 사용할 수 있기 때문에<Control />
드류 녹스

23

그것들은 모두 같은 것입니다. 많은 프레임 워크 요소가 자체적으로 이름 속성을 노출하지만 x : name을 사용할 수없는 사람들에게는 일반적으로 x : name을 사용합니다. 모든 것이 가능하기 때문입니다.

컨트롤은 원하는 경우 (자신의 종속성 속성을 내부적으로 사용해야하기 때문에) 이름 자체를 종속성 속성으로 표시하거나 그렇지 않을 수 있습니다.

msdn 여기여기에 대한 자세한 내용 :

FrameworkElement / FrameworkContentElement와 같은 몇 가지 중요한 기본 클래스에 대해 WPF 네임 스페이스에 지정된 Name 종속성 속성이 동일한 목적을 충족하기 때문에 일부 WPF 프레임 워크 수준 응용 프로그램에서는 x : Name 특성을 사용하지 않을 수 있습니다. Name 속성이없는 요소에 대한 코드 액세스가 필요한 일부 일반적인 XAML 및 프레임 워크 시나리오가 있습니다. 특히 애니메이션 및 스토리 보드 지원 클래스에서 가장 두드러집니다. 예를 들어 코드에서 참조하려는 경우 XAML에서 생성 된 타임 라인 및 변환에 x : Name을 지정해야합니다.

클래스에서 속성으로 Name을 사용할 수있는 경우 Name과 x : Name을 특성으로 상호 교환하여 사용할 수 있지만 둘 다 동일한 요소에 지정된 경우 오류가 발생합니다.


4
차이가 없다면 왜 똑같은 일을하는 두 가지 방법이 있을까요? 두 가지 방법 모두 WPF의 첫 번째 릴리스에 존재했습니다.
Drew Noakes

@ 스티브 (Steve), 나는 지금까지 그 중 어느 것도 그다지 적절하지는 않았지만이 질문에 대한 답을 공감하지 않았습니다.
Drew Noakes

답변에 대한 답변뿐만 아니라 MSDN에 대한 링크를 제공하여 해당 주제에 대한 자세한 정보가 적합하지 않은 방법을 모르겠습니다. :-)
Steven Robbins

5
@ 원래의 답변으로 내 질문에 답변하지 않았으므로 의견을 말하십시오. 나는 맹목적인 믿음을 찾는 것이 아니라 "이 방법으로", 두 가지 방법 중 하나가 항상 작동하더라도 왜 존재하는지 설명하는 통찰력있는 대답을 찾고 있습니다. 기술적으로 맞습니다! = 적절합니다. 업데이트가 훨씬 좋습니다.
Drew Noakes

1
여기에 거의 같은 대답이 있습니다 : wpfwiki.com/WPF%20Q16.4.ashx x : Name은 컨트롤에 코드 숨김에 사용할 이름을 지정하고 있습니다. 일부 수업은 같은 목적으로 이름 속성을 제공합니다. 이러한 클래스의 경우 x : name과 name간에 차이가 없습니다.
Vegar

11

X : Name은 사용자 지정 컨트롤이있는 경우 메모리 문제를 일으킬 수 있습니다. NameScope 항목의 메모리 위치를 유지합니다.

꼭 필요한 경우가 아니면 x : Name을 사용하지 마십시오.


동의했다. 수많은 메모리 누수가 발생한 키오스크 앱에서 작업했으며 이전 개발자 팀의 해결책은 재부팅을 강제하는 것입니다. 많은 누출이 쉽게 식별되었습니다. 그러나 IntelliTrace 및 JustTrace를 통해 찾은 것을 수정 한 후에도 여전히 암시적이고 명시적인 가비지 수집을 피했습니다. 나는 읽습니다 : support.scichart.com/index.php?/News/NewsItem/View/21/… x : Name을 줄이면 성능이 더 향상된다는 것을 알았습니다 .
MachinusX

2
이것이 NameScope에 추가 될 때 이것이 Namex : Name 모두에 영향을 미친다 는 것을 이해합니다 . 당신의 요소에 이름이 필요하다면, 그 주위를 돌아 다닐 필요가 없습니다. 를 통해 이름이없는 요소에서 코드로 재현 할 수 있습니다 . 그러나 전화 하면 "역 참조"될 수 있습니다. FrameworkElement.RegisterName("elementname")FrameworkElement.UnregisterName("elementname")
Adam Caviness

8

유일한 차이점은 동일한 어셈블리의 컨트롤에 사용자 컨트롤을 사용하는 경우 이름에서 컨트롤을 식별하지 못하고 "같은 어셈블리의 컨트롤에 x : Name 사용"오류가 발생한다는 것입니다. 따라서 x : Name은 WPF에서 명명 컨트롤의 WPF 버전 관리입니다. 이름은 Winform 레거시로 사용됩니다. 그들은 Xaml의 속성을 사용하여 제어 이름에 x :를 사용하는 다른 어셈블리에서 제어를 식별 할 때 WPF와 winforms의 제어 이름을 구별하고 싶었습니다.

빈칸으로 메모리에 상주하는 그대로 유지하기 위해 컨트롤의 이름을 입력하지 마십시오. 이름은 컨트롤에 적용되었지만 결코 사용되지 않았다는 경고를 표시합니다.


8

이름 :

  1. FrameworkElement 및 FrameworkContentElement의 자손에만 사용할 수 있습니다.
  2. SetValue () 및 속성과 같은 코드 숨김에서 설정할 수 있습니다.

x : 이름 :

  1. 거의 모든 XAML 요소에 사용할 수 있습니다.
  2. SetValue ()를 통해 코드 숨김에서 설정할 수 없습니다. 지시어이기 때문에 객체에서 속성 구문을 사용해서 만 설정할 수 있습니다.

하나의 FrameworkElement 또는 FrameworkContentElement에 대해 XAML의 두 지시문을 모두 사용하면 예외가 발생합니다. XAML이 마크 업 컴파일 된 경우 마크 업 컴파일에서 예외가 발생하고 그렇지 않으면로드시 발생합니다.


7

x:Name 의미 :이 객체에 대한 참조를 보유하기 위해 코드 뒤에 필드를 만듭니다.

Name 의미 :이 객체의 이름 속성을 설정합니다.


이것은 사실이 아닙니다. 둘 다 코드 숨김에서 액세스 할 수 있지만 흥미롭게도 런타임에는 x : Name 만 업데이트 할 수 있습니다. 멋진.

4

항상 x : Name 변형을 사용합니다. 이것이 성능에 영향을 미치는지 전혀 모르겠습니다. 다음과 같은 이유로 더 쉽게 찾을 수 있습니다. 다른 어셈블리에 상주하는 사용자 컨트롤이있는 경우 "Name"속성만으로 충분하지는 않습니다. 이렇게하면 x : Name 속성도 쉽게 붙일 수 있습니다.


4
차이가 없다면 왜 똑같은 일을하는 두 가지 방법이 있을까요? 두 가지 방법 모두 WPF의 첫 번째 릴리스에 존재했습니다.
Drew Noakes

3

WPF 항목은 아니지만 표준 XML 항목이며 BtBh 가 올바르게 응답했습니다. x는 기본 네임 스페이스를 나타냅니다. XML에서 요소 / 속성에 네임 스페이스를 접두사로 지정하지 않으면 기본 네임 스페이스를 원한다고 가정합니다. 따라서 타이핑은 단지 Name짧은 손에 지나지 않습니다 x:Name. XML 네임 스페이스에 대한 자세한 내용은 링크 텍스트를 참조하십시오.


-1 x로 유혹 : 다른 XML 네임 스페이스를 의미하지만 실제로는 Q에 대한 유용한 대답이 아닙니다. : /
Tim Lovell-Smith

2

정답 중 하나는 x : name이 c #과 같은 다른 프로그램 언어 내에서 사용되고 name이 프레임 워크에 사용된다는 것입니다. 솔직히 그게 나에게 들리는 것입니다.


2

지정된 x : Name 은 XAML이 처리 될 때 기본 코드에서 생성되는 필드의 이름이되며 해당 필드는 개체에 대한 참조를 보유합니다. Silverlight에서 관리되는 API를 사용하여이 필드를 만드는 프로세스는 MSBuild 대상 단계에서 수행되며, XAML 파일 및 해당 코드 숨김의 부분 클래스를 결합하는 역할도 담당합니다. 이 동작이 반드시 XAML 언어로 지정된 것은 아닙니다. x : Name 을 사용하기 위해 Silverlight가 적용되는 것은 특정 구현입니다 .프로그래밍 및 응용 프로그램 모델에서 .

MSDN에 대한 추가 정보 ...


2

XAML에서 Button 요소를 선언하면 Button이라는 Windows 런타임에 정의 된 클래스를 참조하게됩니다.

버튼에는 배경, 텍스트, 여백, .....과 같은 많은 속성과 이름이라는 속성이 있습니다.

이제 XAML에서 Button을 선언하면 Name이라는 특성이있는 익명 개체를 만드는 것과 같습니다.

일반적으로 익명 개체를 참조 할 수 없지만 WPF 프레임 워크에서 XAML 프로세서를 사용하면 Name 특성에 지정한 값으로 해당 개체를 참조 할 수 있습니다.

여태까지는 그런대로 잘됐다.

개체를 만드는 또 다른 방법은 익명 개체 대신 명명 된 개체를 만드는 것입니다. 이 경우 XAML 네임 스페이스에는 Name이라는 개체에 대한 특성이 있으며 (XAML 네임 스페이스에 있으므로 X :가 있으므로) 개체를 식별하고 참조 할 수 있도록 설정할 수 있습니다.

결론:

이름은 특정 객체의 속성이지만 X : Name은 해당 객체의 속성 중 하나입니다 (일반 객체를 정의하는 클래스가 있음).


0

내 연구는 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}" />

당신은 할 수없는 Binding재산 ContentButton이름은 때문에 외부 "BTN"입니다StackPanel

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.