Style과 ControlTemplate의 차이점
Style과 ControlTemplate의 주요 차이점은 무엇입니까? 둘 중 하나를 언제 또는 왜 사용해야합니까?
내 눈에, 그들은 정확히 매우이다 동일 . 나는 초심자로서 내가 틀렸다고 생각하므로 내 질문입니다.
스타일에서 컨트롤의 속성을 설정합니다.
<Style x:Key="MyButtonStyle" TargetType="Button">
<Setter Property="Background" Value="Red"/>
</Style>
<Button Style="{StaticResource MyButtonStyle}"/>
이 스타일을 사용하는 모든 버튼은 배경이 빨간색으로 설정됩니다.
템플릿에서 컨트롤의 UI (구조)를 정의합니다.
<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
<Grid>
<Rectangle Fill="Green"/>
<ContentPresenter/>
</Grid>
</ControlTemplate>
<Button Template="{StaticResource MyButtonTemplate}"/>
이 템플릿을 사용하는 모든 버튼은 변경할 수없는 녹색 배경을 갖습니다.
템플릿에 설정된 값 은 전체 템플릿을 바꿔야 만 바꿀 수 있습니다. A의 값 스타일이 컨트롤을 사용하는 경우 명시 적으로 값을 설정하여 교체 할 수 있습니다. 따라서 값을 코딩하는 대신 TemplateBinding을 사용하여 컨트롤의 속성을 사용하는 것이 좋습니다.
<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
<Grid>
<Rectangle Fill="{TemplateBinding Background}"/>
<ContentPresenter/>
</Grid>
</ControlTemplate>
이제 템플릿은 적용된 버튼의 Background 속성 값을 사용하므로 사용자 지정할 수 있습니다.
<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/>
또 다른 유용한 기능은 컨트롤이 특정 스타일을 지정하지 않고도 기본 스타일을 선택할 수 있다는 것입니다. 템플릿으로는 할 수 없습니다.
스타일의 x : Key 속성을 제거하기 만하면됩니다 (다시 말하지만 템플릿으로는이 작업을 수행 할 수 없습니다). 스타일 아래의 시각적 트리에있는 모든 버튼에는이 스타일이 적용됩니다.
템플릿과 스타일을 결합하는 것은 매우 강력합니다. 스타일에서 Template 속성을 설정할 수 있습니다.
<Style TargetType="Button">
<Setter Property="Background" Value="Red"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Rectangle Fill="{TemplateBinding Background"/>
<ContentPresenter/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
당신은 정말 틀 렸습니다. 스타일 은 컨트롤의 속성 을 설정 합니다. ControlTemplate은 렌더링 방법을 지정하는 대부분의 컨트롤에서 공유 하는 속성 입니다.
정교하게하기 위해 스타일을 사용하여 여러 속성에 대한 설정을 그룹화하여이를 재사용하여 컨트롤을 표준화 할 수 있습니다. 스타일은 컨트롤에 명시 적으로 설정하거나 특정 유형 모두에 적용 할 수 있습니다.
컨트롤 템플릿은 스타일로 설정하거나 컨트롤에 명시 적으로 설정하여 표시 방식을 변경할 수 있습니다. 모든 컨트롤에는 .net wpf 어셈블리에 포함 된 기본 템플릿 (및 해당 문제에 대한 스타일)이 있습니다. 이것을보고 wpf 개발자가 모든 컨트롤의 일반 버전을 구현 한 방법을 이해하는 것은 매우 계몽 적입니다. Expression blend가 설치되어있는 경우 "SystemThemes"폴더를 살펴보십시오.
최신 정보:
스타일 및 ControlTemplates가 "컨트롤을 추가"하는 방법을 이해합니다. 어떤 식 으로든 ControlTemplate은 컨트롤이 구성되는 컨트롤을 정의하는 유일한 방법입니다 . 그러나 일부 기본 .net 컨트롤을 사용하면 텍스트 대신 컨트롤을 사용할 수 있습니다.
예를 들면 :
<GroupBox>
<GroupBox.Header>
<CheckBox/>
</GroupBox.Header>
</GroupBox>
This "adds" a checkbox to the groupbox without changing the ControlTemplate
, but this is because the default ControlTemplate
for GroupBox
allows anything as the Header. This is done by using special controls such as ContentPresenter
.
However, sometimes the default ControlTemplate for a control doesn't allow you to change something that you want to change via properties. Then you must change the ControlTemplate.
Whether you set the Properties of a control (Content, Header, ControlTemplate, IsEnabled, etc.) directly or via a style does not matter, Styles are only a convenience.
Hopefully this answers your question more clearly.
You can think of a Style as a convenient way to apply a set of property values to more than one element. You can change the default appearance by setting properties, such as FontSize and FontFamily, on each TextBlock element directly. However, if you want your TextBlock elements to share some properties, you can create a Style in the Resources section of your XAML file.
On the other hand, a ControlTemplate specifies the visual structure and visual behavior of a control. You can customize the appearance of a control by giving it a new ControlTemplate. When you create a ControlTemplate, you replace the appearance of an existing control without changing its functionality. For example, you can make the buttons in your application round instead of the default square shape, but the button will still raise the Click event.
Ref: http://msdn.microsoft.com/en-us/library/ms745683.aspx
I found some interesting differences in The difference between styles and templates (msdn)
Style: You can set only pre-existing properties in the style. For example, you cannot set a default value for a property that belongs to a new part that you added to the template.
Template: When you modify a template, you have access to more parts of a control than when you modify a style. For example, you can change the way the pop-up list appears in a combo box, or you change the look of the button that triggers the pop-up list in the combo box by modifying the items template.
Style: You can use styles to specify the default behavior of a control. For example, in a style for a button, you can specify a trigger so that when users move their mouse pointer over the button, the background color will change. These property changes are instantaneous (they cannot be animated gradually).
Template: You can specify the behavior of any new and existing parts in a template by using triggers. For example, you can specify a trigger so that when users move their mouse pointer over a button, the color of one of the parts will change. These property changes can be instantaneous or animated gradually to produce a smooth transition.
OK, I had the exact same question and the answers I found in this thread pointed me in the right direction so I'm sharing, if only so I can understand it better myself.
A Style is more flexible than a ControlTemplate.
From Windows Presentation Foundation Unleashed, Adam Nathan and gang (writers) state this:
"Besides the convenience of combining a template [with a style using the Style's ControlTemplate setter] with arbitrary property settings, there are important advantages of doing this [setting the ControlTemplate setter on a style]:
- It gives you the effect of default templates. For example, when a typed Style gets applied to elements by default, and that Style contains a custom control template, the control template gets applied without any explicitly markings on those elements.
- It enables you to provide default yet overridable property valus that control the look of the template. In other words, it enables you to respect the templated parent's properties but still provide your own default values."
In other words, creating a style allows the user of the Style's Template setter to override the values set, even if they did not use a TemplateBinding ({TemplateBinding Width} for example). If you hardcoded the Width in your style, the user of the Style could still override it, but if you hardcoded that Width property in a Template, the user is stuck with it.
Also, (and this is kind of confusing) when using a ContentTemplate with a TemplateBinding the onus is on the user to set that property otherwise it will use the default property for the TargetType. If you use a style, you can override the default property of the TargetType by using a setter for the property and then applying a TemplateBinding referencing back to that setter. The book explains it better, page 338 (Mixing Templates with Styles)
참고URL : https://stackoverflow.com/questions/6136200/difference-between-style-and-controltemplate
'IT박스' 카테고리의 다른 글
이 reinterpret_cast가 컴파일되지 않는 이유는 무엇입니까? (0) | 2020.12.01 |
---|---|
iPhone UIWebView를 사용할 때 Asp.Net 양식 인증 (0) | 2020.12.01 |
Assets 폴더의 파일에 Android 경로 문자열을 가져 오는 방법은 무엇입니까? (0) | 2020.12.01 |
Facebook OAuth 2.0 "코드"및 "토큰" (0) | 2020.12.01 |
Array.empty의 반대 방법은 무엇입니까? (0) | 2020.12.01 |