C#(.Net)/WPF

CustomControl에서의 PART_ 네이밍 규칙

junl 2025. 8. 4. 08:59

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_를 붙여야 한다.

 

 

https://learn.microsoft.com/en-us/dotnet/api/system.windows.templatepartattribute?view=windowsdesktop-9.0&redirectedfrom=MSDN

 

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