본 내용은 자료가 좀 많다. -.- 우선 정리는 시간이 걸리기 때문에 차후에 해야 할거 같다.
간단하게 정리 하면... Employee 라는 직원 정보를 담고 있는 클래스를 하나 제작한다. Button의 Content의 프로퍼티를 Employee 객체로 설정하여 버튼을 확장하는 예제이다. 여기에서 사용되는 내용은 ContentTemplate, DataTemplate, DataTemplateSelector, DataTemplate.Triggers 등에 대한 내용을 담고 있다. (이 내용은 WPF 서적의 25장. 템플릿의 내용이다.)
ControlTemplate 태그 내에는 TargetType 속성을 포함하는 것이 가능하다. <ControlTemplate x:Key="btnCustom" TargetType="{x:Type Button}"> 이 경우 TemplateBinding 표현에서 의존 프로퍼티의 클래스 이름을 앞에 붙일 필요는 없다. 바인딩에는 이 프로퍼티를 참조하라는 정보가 들어 있기 때문.
여러개의 컨트롤이 템플릿을 공유할때 리소스로 정의해야 한다.
btnCustom이라는 x:Key를 가진 ControlTemplate을 정의한 스탠드 얼론 xaml파일이 있다.
ControlTemplate 상에 TargetType 속성을 설정한 이유는 의존 프로퍼티나 이벤트 앞에 반복해서 클래스 이름을 붙이지 않기 위함이다.
Button은 여러 프로퍼티(HorizontalAlignment, VerticalAlignment, fontSize, Padding)을 정의 하고 버튼 컨텐트를 "Button with Custom Template"로 설정
Button.Template 프로퍼티는 ControlTemplate 타입의 프로퍼티이며, FrameworkTemplate과 그것의 파생 클래스의 컨튼트 프로퍼티는 모드 Visual Tree이다.
VisualTree는 굵기가 3인 빨간색의 Border로부터 시작된다.
Background 프로퍼티는 DynamicResource 마크업 확장을 사용해 가져온 시스템 색상
TextBlock을 사용해 이 버튼이 텍스트만 표시하게 제한
TextBlock의 Text 프로퍼티를 Button의 Content 프로퍼티로 설정했다.
TemplateBinding 마크업 확장은 컨트롤이 정의한 플퍼티와 템플릿의 비주얼 트리 속 프로퍼티를 연결하기 위해 정의된다 Text="{TemplateBinding ContentControl.Content}" TemplateBinding 인자는 반드시 의존 프로퍼티여야 한다. 따라서 이 프로퍼티가 정의돈 클래스나 그 프로퍼티를 상속받은 클래스의 이름을 인자에 포함한다. 여기서는 ContentControl.Content 대신 Button.Content를 사용해도 된다.
string 타입의 프로퍼티가 object 타입의 TemplateBinding을 가질수 있다. Margin="{TemplateBinding Button.Padding}"
Trigger 엘리먼트 내의 Setter 엘리먼트는 항상 VisualTree 엘리먼트의 프로퍼티 중 하나에 영향을 미친다. Setter 엘리먼트는 이 프로퍼티의 이름을 Targetname 속성으로 참조하며, Property와 Value 속성은 스타일에서와 같이 동작한다.