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

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

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

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



답변

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은 접근성 도구와 몇 가지 테스트 도구에 의해 사용된다.


답변

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

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

NameFrameworkElementxaml 속성의 형태로 다른 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 : 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")]  


답변

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

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

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

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

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


답변

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

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


답변

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

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


답변

이름 :

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

x : 이름 :

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

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