2011-09-22 2 views
2

두 가지 스타일링 요구 사항이있는 사용자 지정 컨트롤을 만들고 있습니다. 하나는 기본보기 용이고 다른 하나는 고급보기 용입니다.두 가지 스타일 사이를 전환하는 사용자 지정 컨트롤

내 컨트롤은 다음 열거에 대한 종속성 속성을 포함

public enum ControlTypes 
{ 
    Basic, 
    Advanced 
} 

나는 (매우 다른 템플릿)을 generic.xaml을 두 스타일을 만들어, 각각의 키를 주었다.

enum 속성에 대한 변경 처리기 안에 스타일을 찾고 올바른 것을 설정하려고합니다.

두 가지 스타일은 항상 null입니다. generic.xaml 내부에서 스타일을 가져 오는 방법을 모르겠습니다. 아니면 내 스타일을 바꾸는 더 좋은 방법이 있습니까?

+0

단순히 각 컨테이너의 Visible 속성을 현재 열거 형 값에 바인딩하는 방법은 무엇입니까? – kenny

+0

컨트롤에는 (템플릿이 근본적으로 다른 경우에도) 두 템플릿에 대해 동일한 여러 필수 부분이 있습니다. 현재 ApplyTemplate 재정의 내에서 템플릿 파트를 찾고 있습니다. 각 부분에 고유 한 이름을 부여하고 제어 유형이 변경되면 각 부품의 이름을 사용하여 다시 가져옵니다. 이 기발한 디자인은 피하는 것이 좋습니다. – mbursill

+0

이 경우 Visibility 속성을 컨트롤의 "IsAdvancedStyle"속성에 바인딩 할 수 있습니다. 컨트롤의 이름으로 모든 것을 참조하는 대신 최적의 솔루션은 아닙니다. 'Application.Current.TryFindResource'의 결과가 null을 리턴합니까? 그것은'StyleStyle'가 아닌 인스턴스를 반환합니까? 리소스 이름은 대소 문자를 구분한다는 것을 잊지 마십시오. 'generic.xaml'이 메인 애플리케이션 리소스 컬렉션에 올바르게 추가 되었습니까? – fatty

답변

1

OnControlTypePropertyChanged의 코드를 삭제하고 XAML에 다음과 같이 입력하십시오. 이 테스트를 위해 간단했기 때문에 내가 IsAdvanced라는 속성에 바인딩 것을 참고 있지만은 "true"로 변경하여 열거 결합 할 수 {X : 정적 네임 스페이스 : nameofyourenum.Value}

<Style TargetType="local:SomeControl"> 
    <Style.Setters> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:SomeControl"> 
        <StackPanel> 
         <TextBlock Text="DefaultTemplate"></TextBlock> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
    <Style.Triggers> 
     <Trigger Property="IsAdvanced" Value="True"> 
      <Trigger.Setters> 
       <Setter Property="Control.Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="local:SomeControl"> 
          <TextBlock Text="Advanced Template"></TextBlock> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger.Setters> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

참고이 그 컨트롤을 사용하는 프로그래머에게 컨트롤 템플릿을 완전히 무시하고 원하는 것을 수행 할 수있는 권한을 부여합니다. 원래의 접근 방식은 이것을 허용하지 않았습니다.

관련 문제