제목이 다 나와 있습니다. 때로는 속성 Name
과 x:Name
속성이 서로 호환 되는 것 같습니다 .
그래서, 그들 사이의 결정적인 차이점은 무엇이며, 언제 다른 것을 사용하는 것이 바람직합니까?
잘못된 방식으로 사용하면 성능이나 메모리에 영향이 있습니까?
제목이 다 나와 있습니다. 때로는 속성 Name
과 x:Name
속성이 서로 호환 되는 것 같습니다 .
그래서, 그들 사이의 결정적인 차이점은 무엇이며, 언제 다른 것을 사용하는 것이 바람직합니까?
잘못된 방식으로 사용하면 성능이나 메모리에 영향이 있습니까?
답변:
XAML에는 실제로 하나의 이름 만 있습니다 x:Name
. WPF와 같은 프레임 워크 는 클래스 속성 중 하나를 XAML의 x : Name 특성에 대한 매핑으로 지정하는 클래스를 x:Name
사용하여 해당 속성 중 하나를 XAML에 선택적으로 매핑 할 수 있습니다 RuntimeNamePropertyAttribute
.
이것이 수행 된 이유는 WPF와 같이 런타임시 이미 "이름"이라는 개념을 가진 프레임 워크를 허용하기위한 것입니다. 예를 들어 WPF에서 FrameworkElement
Name 속성이 도입되었습니다.
일반적으로 클래스는 x:Name
사용 하기 위해 이름을 저장할 필요가 없습니다 . x:Name
XAML은 모든 클래스 뒤에 코드에 값을 저장하는 필드를 생성합니다. 런타임에서 해당 매핑으로 수행하는 작업은 프레임 워크에 따라 다릅니다.
그렇다면 왜 똑같은 일을하는 두 가지 방법이 있습니까? 간단한 대답은 하나의 속성에 두 개의 개념이 매핑되어 있기 때문입니다. WPF는 런타임에 보존 된 요소의 이름 (바인드를 통해 사용 가능)을 원하며 XAML은 클래스 뒤 코드의 필드에서 어떤 요소에 액세스 할 수 있는지 알고 있어야합니다. WPF는 Name 속성을 x : Name의 별칭으로 표시하여이 두 가지를 하나로 묶습니다.
앞으로 XAML은 이름으로 다른 객체를 참조하여 속성을 설정할 수 있도록하는 등 x : Name에 더 많은 용도를 갖게되지만 3.5 이전에는 필드를 만드는 데만 사용됩니다.
둘 중 하나를 사용해야하는지 여부는 기술적 인 문제가 아니라 스타일 문제입니다. 나는 추천을 위해 다른 사람들에게 맡길 것입니다.
도 참조 AutomationProperties.Name VS는 X : 이름 , 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입니다.
OK는 이것을 다른 방식으로 봅니다. Xaml 페이지로 단추를 끌어다 놓으십시오. 이 두 가지 방법으로 x : name 및 name을 참조 할 수 있습니다 . 모든 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에 액세스합니다.
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을 사용할 수없는 사람들에게는 일반적으로 x : name을 사용합니다. 모든 것이 가능하기 때문입니다.
컨트롤은 원하는 경우 (자신의 종속성 속성을 내부적으로 사용해야하기 때문에) 이름 자체를 종속성 속성으로 표시하거나 그렇지 않을 수 있습니다.
FrameworkElement / FrameworkContentElement와 같은 몇 가지 중요한 기본 클래스에 대해 WPF 네임 스페이스에 지정된 Name 종속성 속성이 동일한 목적을 충족하기 때문에 일부 WPF 프레임 워크 수준 응용 프로그램에서는 x : Name 특성을 사용하지 않을 수 있습니다. Name 속성이없는 요소에 대한 코드 액세스가 필요한 일부 일반적인 XAML 및 프레임 워크 시나리오가 있습니다. 특히 애니메이션 및 스토리 보드 지원 클래스에서 가장 두드러집니다. 예를 들어 코드에서 참조하려는 경우 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 레거시로 사용됩니다. 그들은 Xaml의 속성을 사용하여 제어 이름에 x :를 사용하는 다른 어셈블리에서 제어를 식별 할 때 WPF와 winforms의 제어 이름을 구별하고 싶었습니다.
빈칸으로 메모리에 상주하는 그대로 유지하기 위해 컨트롤의 이름을 입력하지 마십시오. 이름은 컨트롤에 적용되었지만 결코 사용되지 않았다는 경고를 표시합니다.
이름 :
x : 이름 :
하나의 FrameworkElement 또는 FrameworkContentElement에 대해 XAML의 두 지시문을 모두 사용하면 예외가 발생합니다. XAML이 마크 업 컴파일 된 경우 마크 업 컴파일에서 예외가 발생하고 그렇지 않으면로드시 발생합니다.
항상 x : Name 변형을 사용합니다. 이것이 성능에 영향을 미치는지 전혀 모르겠습니다. 다음과 같은 이유로 더 쉽게 찾을 수 있습니다. 다른 어셈블리에 상주하는 사용자 컨트롤이있는 경우 "Name"속성만으로 충분하지는 않습니다. 이렇게하면 x : Name 속성도 쉽게 붙일 수 있습니다.
WPF 항목은 아니지만 표준 XML 항목이며 BtBh 가 올바르게 응답했습니다. x는 기본 네임 스페이스를 나타냅니다. XML에서 요소 / 속성에 네임 스페이스를 접두사로 지정하지 않으면 기본 네임 스페이스를 원한다고 가정합니다. 따라서 타이핑은 단지 Name
짧은 손에 지나지 않습니다 x:Name
. XML 네임 스페이스에 대한 자세한 내용은 링크 텍스트를 참조하십시오.
지정된 x : Name 은 XAML이 처리 될 때 기본 코드에서 생성되는 필드의 이름이되며 해당 필드는 개체에 대한 참조를 보유합니다. Silverlight에서 관리되는 API를 사용하여이 필드를 만드는 프로세스는 MSBuild 대상 단계에서 수행되며, XAML 파일 및 해당 코드 숨김의 부분 클래스를 결합하는 역할도 담당합니다. 이 동작이 반드시 XAML 언어로 지정된 것은 아닙니다. x : Name 을 사용하기 위해 Silverlight가 적용되는 것은 특정 구현입니다 .프로그래밍 및 응용 프로그램 모델에서 .
XAML에서 Button 요소를 선언하면 Button이라는 Windows 런타임에 정의 된 클래스를 참조하게됩니다.
버튼에는 배경, 텍스트, 여백, .....과 같은 많은 속성과 이름이라는 속성이 있습니다.
이제 XAML에서 Button을 선언하면 Name이라는 특성이있는 익명 개체를 만드는 것과 같습니다.
일반적으로 익명 개체를 참조 할 수 없지만 WPF 프레임 워크에서 XAML 프로세서를 사용하면 Name 특성에 지정한 값으로 해당 개체를 참조 할 수 있습니다.
여태까지는 그런대로 잘됐다.
개체를 만드는 또 다른 방법은 익명 개체 대신 명명 된 개체를 만드는 것입니다. 이 경우 XAML 네임 스페이스에는 Name이라는 개체에 대한 특성이 있으며 (XAML 네임 스페이스에 있으므로 X :가 있으므로) 개체를 식별하고 참조 할 수 있도록 설정할 수 있습니다.
결론:
이름은 특정 객체의 속성이지만 X : Name은 해당 객체의 속성 중 하나입니다 (일반 객체를 정의하는 클래스가 있음).
내 연구는 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
재산 Content
의 Button
이름은 때문에 외부 "BTN"입니다StackPanel
x:Name
항상 사용 하는 것이 좋습니다 . 방금 변경해야했습니다.Name
그렇지 않으면 .xaml.cs 코드에서 컨트롤을 참조 할 수 없으므로 더 이상 항상 잘 작동한다고 가정합니다.