2012-02-06 2 views
2

특정 상태에있을 때마다 사용자 지정 스타일을 컨트롤에 적용하려고하는데이 스타일을 스타일로 개체에 설정할 수 있습니다. 이 작업을 수행하는 트리거를 설정할 때, 스타일 속성을 다시 설정할 수 없습니다 :마우스 오버 또는 포커스시 조건부 스타일 적용

<Style TargetType="{x:Type ContentPresenter}"> 
    <Style.Triggers> 
    <Trigger Property="ContentTemplate" Value="{x:Null}"> 
     <Setter Property="Style" Value="{Binding MouseOverGroupStyle, RelativeSource={RelativeSource TemplatedParent}}" /> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

스타일 객체가 적용되는 개체의 스타일 속성에 영향을 미칠 수 없습니다.

그러나 대체 방법은 무엇입니까? 나는 읽기 전용이므로 setters 목록에 바인딩 할 수 없습니다.

답변

2

귀하의 솔루션을 사용하는 것입니다 ContentPresenter를 취하여 ContentTemplate을 확인하는 StyleSelector.

internal class ContentTemplateStyleSelector : StyleSelector 
    { 
     public Style NullStyle { get; set; } 
     public Style DefaultStyle { get; set; } 

     public override Style SelectStyle(object item, DependencyObject container) 
     { 
      var cp = container as ContentPresenter; 

      if (cp == null) 
       return null; 

      if (cp.ContentTemplate == null) 
       return NullStyle; 

      return DefaultStyle; 
     } 
    } 

불행하게도, ContentPresenter에 당신이하는 일에 ContentPresenter에에서 전송해야 할 수도 있습니다, 그래서 당신은 당신의 ContentTemplateStyleSelector의 인스턴스의 정적 리소스를 결합 할 수있는 스타일 선택기 속성이 없습니다.

또는 DataTemplateSelector를 사용하는 옵션이 있습니다.

1

스타일에 따라 Template 속성을 변경할 수 있습니다.

또 다른 방법은 VisualState을 사용하는 것입니다. 스타일 (Style)의 개체가 적용되는 개체의 스타일 속성에 영향을 미치는 허용되지 않습니다

+0

VisualStates를 사용하면 이동하는 방법처럼 보입니다. 이렇게하면 마우스가 끝났을 때 수행 할 애니메이션을 정의 할 수도 있습니다. 기술적으로 내가 찾던 답변이 아니지만 차선책 인 것처럼 보입니다. – Abstractor