source

스타일과 ControlTemplate의 차이점

nicesource 2023. 4. 24. 23:29
반응형

스타일과 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}"/>

이 템플릿을 사용하는 모든 버튼의 배경은 녹색이며 변경할 수 없습니다.

템플릿에 설정된 값은 템플릿 전체를 대체해야만 바꿀 수 있습니다.스타일 값은 컨트롤을 사용할 때 값을 명시적으로 설정하여 대체할 수 있습니다.따라서 값을 코딩하는 대신 TemplateBinding을 사용하여 컨트롤 속성을 사용하는 것이 좋습니다.

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
    <Grid>
        <Rectangle Fill="{TemplateBinding Background}"/>
        <ContentPresenter/>
    </Grid>
</ControlTemplate>

템플릿은 적용되는 버튼의 [Background]속성 값을 사용하여 커스터마이즈할 수 있습니다.

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/>

또 다른 유용한 기능은 컨트롤에 특정 스타일을 할당하지 않고도 기본 스타일을 선택할 수 있다는 것입니다.템플릿으로는 할 수 없습니다.

스타일의 x:Key 속성을 삭제하기만 하면 됩니다(또한 템플리트에서는 이 작업을 수행할 수 없습니다).스타일 아래의 비주얼 트리에 있는 모든 버튼에 이 스타일이 적용됩니다.

템플릿과 스타일을 조합하면 다음과 같이 템플릿 특성을 설정할 수 있습니다.

<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가 설치되어 있는 경우 "시스템"을 참조하십시오.[테마] 폴더.

갱신:

Styles 및 ControlTemplate가 "컨트롤 추가"하는 방법을 이해하려면 다음과 같이 하십시오.어떤 식으로든 ControlTemplate는 컨트롤로 구성되는 컨트롤을 정의하는 유일한 방법입니다.그러나 일부 기본 .net 컨트롤을 사용하면 텍스트 대신 컨트롤을 사용할 수 있습니다.

예를 들어 다음과 같습니다.

<GroupBox>
  <GroupBox.Header>
    <CheckBox/>
  </GroupBox.Header>
</GroupBox>

는 .ControlTemplate, 이는 의 디폴트에서는 헤더로서 모든 것이 허용되기 때문입니다.이는 다음과 같은 특수 컨트롤을 사용하여 수행됩니다.ContentPresenter.

그러나 컨트롤의 기본 ControlTemplate에서는 속성을 통해 변경할 항목을 변경할 수 없습니다.그런 다음 ControlTemplate를 변경해야 합니다.

컨트롤의 속성(Content, Header, ControlTemplate, IsEnabled 등)을 직접 설정하든 스타일을 통해 설정하든 상관없이 스타일은 편리할 뿐입니다.

이게 당신의 질문에 좀 더 명확하게 답해주길 바랍니다.

스타일을 둘 이상의 요소에 특성 값 집합을 적용하는 편리한 방법으로 생각할 수 있습니다.각 TextBlock 요소에 직접 FontSize 및 FontFamily 등의 속성을 설정하여 기본 모양을 변경할 수 있습니다.그러나 TextBlock 요소가 일부 속성을 공유하도록 하려면 XAML 파일의 리소스 섹션에 스타일을 만들 수 있습니다.

한편 ControlTemplate는 컨트롤의 시각적 구조와 시각적 동작을 지정합니다.컨트롤에 새 ControlTemplate를 지정하여 컨트롤 모양을 사용자 정의할 수 있습니다.ControlTemplate를 생성할 때 기능을 변경하지 않고 기존 컨트롤의 모양을 바꿉니다.예를 들어, 기본 정사각형 모양 대신 응용 프로그램의 단추를 둥글게 만들 수 있지만 단추를 누르면 클릭 이벤트가 계속 표시됩니다.

참고 자료: http://msdn.microsoft.com/en-us/library/ms745683.aspx

스타일과 템플릿의 차이(msdn)에서 흥미로운 차이를 발견했습니다.

스타일: 스타일에서 기존 특성만 설정할 수 있습니다.예를 들어 템플릿에 추가한 새 부품에 속하는 속성의 기본값을 설정할 수 없습니다.

템플릿:템플릿을 수정할 때 스타일을 수정할 때보다 컨트롤의 많은 부분에 액세스할있습니다.예를 들어 콤보 상자에 팝업 목록이 표시되는 방법을 변경하거나 항목 템플릿을 수정하여 콤보 상자에서 팝업 목록을 트리거하는 버튼 모양을 변경할 수 있습니다.


스타일: 스타일을 사용하여 컨트롤의 기본 동작을 지정할 수 있습니다.예를 들어 단추 스타일에서 사용자가 마우스 포인터를 단추 위로 이동할 때 배경색이 변경되도록 트리거를 지정할 수 있습니다.이러한 속성 변경은 즉시 이루어집니다(점차적으로 애니메이션화할 수 없습니다).

템플릿:트리거를 사용하여 템플릿에 있는 새 부품과 기존 부품의 동작을 지정할 수 있습니다.예를 들어 사용자가 마우스 포인터를 단추 위로 이동할 때 부품 중 하나의 색상이 변경되도록 트리거를 지정할 수 있습니다.이러한 특성 변경은 즉시 수행되거나 점차적으로 활성화되어 원활한 전환을 생성할 수 있습니다.

네, 저도 같은 질문을 했고, 이 스레드에서 찾은 답변이 올바른 방향을 제시해줬기 때문에 제가 더 잘 이해할 수 있도록 공유하겠습니다.

스타일은 ControlTemplate보다 유연합니다.

Windows Presentation Foundation Unlised에서 Adam Nathan과 갱(작가)은 다음과 같이 말합니다.

  • "템플릿(Style의 ControlTemplate setter를 사용하는 스타일)을 임의의 속성 설정과 결합하는 편리함 외에도 [Style에 ControlTemplate setter를 설정하는] 중요한 장점이 있습니다.

    1. 기본 템플릿의 효과를 얻을 수 있습니다.예를 들어, 입력된 스타일이 기본적으로 요소에 적용되고 해당 스타일에 사용자 정의 제어 템플릿이 포함된 경우 해당 요소에 명시적으로 표시하지 않고 제어 템플릿이 적용됩니다.
    2. 템플릿 모양을 제어하는 기본 속성 값을 재정의할 수 있습니다.즉, 템플릿화된 부모의 속성을 존중하면서도 자신의 기본값을 제공할 수 있습니다."

즉, 스타일을 작성하면 TemplateBinding(예: TemplateBinding Width)을 사용하지 않았더라도 Style의 TemplateSetter 사용자가 값 세트를 재정의할 수 있습니다.사용자 스타일로 너비를 하드코딩한 경우, 스타일의 사용자는 여전히 너비 특성을 재정의할 수 있지만 템플릿에서 해당 너비 특성을 하드코딩한 경우에는 사용자가 너비 특성을 그대로 유지합니다.

또한 TemplateBinding과 함께 ContentTemplate를 사용하는 경우 사용자가 해당 속성을 설정해야 합니다.그렇지 않으면 TargetType 기본 속성이 사용됩니다.스타일을 사용하는 경우 속성에 대해 세터를 사용한 다음 해당 세터에 다시 참조하는 TemplateBinding을 적용하여 TargetType의 기본 속성을 재정의할 수 있습니다.338페이지(템플릿과 스타일을 혼용)에서 더 잘 설명합니다.

언급URL : https://stackoverflow.com/questions/6136200/difference-between-style-and-controltemplate

반응형