CustomControl에서의 PART_ 네이밍 규칙
Custom Control을 만들어서 다른 사람들이 Template을 바꾸게 하려는 경우, 내부에서 꼭 필요한 요소에는 PART_를 붙여야 한다. 다른 사람에게 해당 컨트롤을 배포하지 않을 거면, 굳이 PART_를 붙이지 않아도 된다.
- PART_ 접두사는 Template에서 반드시 있어야 할 이름 있는 요소들을 나타낸다.
- TemplatePart 특성(Attribute)은 이런 필수 요소들을 외부에 알리는 방식이다.
- OnApplyTemplate()는 Template이 적용된 후에 내부 요소들을 찾아서 동작을 연결하는 곳이다.
왜 PART_ 라는 이름을 쓰는가?
WPF에서는 Custom Control을 만들 때, 외부에서 ControlTemplate을 마음대로 바꿀 수 있다. 그런데 어떤 Template이 적용되더라도 내부에 반드시 있어야 하는 요소가 있을 수 있다. 예를 들어:
- NumericUpDown 컨트롤은 꼭 TextBox, UpButton, DownButton이 있어야 한다.
- 그래서 이런 필수 요소는 PART_ 접두사를 붙여 Template 작성자에게 알린다.
- 이건 컨트롤을 사용자 정의 템플릿으로 바꿔도 반드시 포함되어야 할 부분이라는 뜻이다.
[TemplatePart] 어트리뷰트는 뭐하는 건가?
[TemplatePart(Name = "PART_TextBox", Type = typeof(TextBox))]
- 이건 메타데이터 역할을 한다.
- 이 컨트롤(NumericUpDown)을 사용할 사람이 Template을 작성할 때 "어떤 이름의 어떤 타입이 필요한지" 알려주는 목적이다.
- 런타임에 특별한 기능은 하지 않지만, 디자인 도구(XAML 디자이너 등)나 다른 개발자에게 문서처럼 작동한다.
OnApplyTemplate()은 왜 쓰는가?
OnApplyTemplate() 메서드는 컨트롤이 실제로 화면에 그려질 때 내부 Template이 적용되면서 호출된다.
여기에서 Template.FindName(...)을 사용하여 XAML Template 내부의 이름 있는 요소들을 찾는다.
TextBox textBox = Template.FindName("PART_TextBox", this) as TextBox;
- 이렇게 찾은 컨트롤 요소에 이벤트 핸들러 연결, 초기값 설정 등 필요한 작업을 한다.
그래서 정리하면...
| 요소 | 역할 |
| PART_ 접두사 | Template에서 필수적으로 있어야 할 요소임을 표시 |
| [TemplatePart] 어트리뷰트 | 외부에 이 필수 요소의 존재와 타입을 명시함 (문서 + 디자인 도구 지원용) |
| OnApplyTemplate() | 실제 Template이 적용된 후에 내부 요소를 찾아서 조작할 수 있는 메서드 |
그럼 언제 PART_ 이름을 써야 할까?
- 직접 ControlTemplate을 작성하는 경우에는 PART_를 사용하지 않아도 된다. 이름을 마음대로 지어도 된다.
- 그러나 Custom Control을 만들어서 다른 사람들이 Template을 바꾸게 하려는 경우, 내부에서 꼭 필요한 요소에는 PART_를 붙여야 한다.
TemplatePartAttribute Class (System.Windows)
Represents an attribute that is applied to the class definition to identify the types of the named parts that are used for templating.
learn.microsoft.com
https://stackoverflow.com/questions/3276446/naming-of-wpf-controls-in-markup
Naming of WPF-Controls in Markup
As I stated in another post, I access at times controls direct from the code behind. If I do this I name the controls as I do also in ControlTemplates and DataTemplates, I give them the prefix PART...
stackoverflow.com