2009-09-29 2 views
14

토글 단추에서 확장되는 간단한 사용자 지정 컨트롤을 만들면 사용자가 XAML에서 직접 선택되지 않은 내용을 지정할 수 있습니다. 그것은 잘 작동하지만 방아쇠를 기반으로하고, 스타일을 제외하고 방아쇠를 정의하는 방법을 모른다. 스타일을 정의하면 사용자 정의 컨트롤 외부에서 설정 한 내용이 모두 손실됩니다.기존 스타일을 재정의하지 않고 WPF 사용자 정의 컨트롤에 트리거를 추가하는 방법은 무엇입니까?

내가 할 수 있기를 원하는 것은 컨트롤의 다른 곳에 설정된 기존 스타일에이 트리거를 추가하는 것입니다.

다음은 스타일/트리거에 대한 XAML입니다.

<ToggleButton.Style> 
    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}"> 
     <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" /> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content" 
         Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ToggleButton.Style> 

나는 기본 유형으로 BasedOn 통해 스타일을 상속 시도했지만 사용자 지정 컨트롤은 부모가 설정 한 명시 적 스타일이 경우 작동하지 않습니다. 또한 EventTriggers를 고려했지만 컨트롤을 초기화하는 이벤트가있을 것이라고는 생각하지 않습니다.

누구든지 제공 할 수있는 도움에 감사드립니다. :)

답변

17

여기서 용어를 정리하면 다음과 같습니다. A 사용자 정의 컨트롤은 UserControl 클래스에서 파생되는 컨트롤입니다. ToggleButton에서 파생 된 바로 당신을 이해한다면 UncheckedContent 및 CheckedContent 속성을 추가하십시오. 이 경우 사용자 지정 컨트롤을 만들었습니다. 공통 용어에 동의하면 항상 따라하기가 더 쉽습니다.

XAML에서 일반적인 스타일 상속을 수행 할 수 없다는 것을 알고있는 한. 다른 스타일이 어떤 스타일을 기반으로하는지 명시 적으로 명시해야합니다. 스타일은 ToggleButton의 기본 스타일이나 특정 다른 스타일을 기반으로 할 수 있습니다. 당신이 그것을 존중하는 스타일 상속 체인을 만들 수 없다면,이 접근법은 작동하지 않을 것입니다.

하지만 사용자 정의 컨트롤이 있기 때문에 기본 토글 단추 스타일을 기반으로하는 기본 스타일을 이처럼 작성할 수 없었습니까?

<Style TargetType="{x:Type CustomToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 

토글 버튼에 명시적인 스타일을 적용 할 때마다 기본 토글 버튼 스타일을 기반으로 지정됩니다.

또한 위의 트리거가 포함 된 Themes \ Generic.xaml에 새 토글 버튼에 대한 (기본) 컨트롤 템플릿을 작성할 수 있습니다. 혼합하면 토글 버튼의 ​​기본 템플리트 사본 ("템플리트 편집"-> "사본 편집")을 얻을 수 있으므로 토글 버튼이 일반 토글 버튼과 정확하게 일치하는지 확인할 수 있습니다. 그런 다음 위의 트리거를 해당 템플릿에 통합하십시오.

현재 : 새 속성을 추가하기 위해 새 컨트롤을 만들 필요는 없습니다. attached properties을 사용하여 기존 컨트롤에 새 속성을 추가 할 수 있습니다. 일반 속성과 마찬가지로 XAML에서 사용할 수 있습니다.

+0

입력 해 주셔서 감사합니다. 매우 도움이되었습니다. 나는 조금 다른 길을 갔다가 기존 스타일을 망가 뜨리지 않고 방아쇠를 추가하기 위해 코드의 뒤에 확장했다. 내가 이미 시도한 BasedOn 제안은 명시 적 스타일이 설정된 경우 작동하지 않습니다. 나는 당신의 아이디어에서 거기에 도착 했으므로 나는 그것을 대답으로 표시하고있다. 첨부 된 속성 아이디어가 정말 좋았으며 그 변경 사항도 적용했습니다. 감사합니다. :) –

+1

당신이 한 일에 대한 자세한 내용을 게시 하시겠습니까? 나는 똑같은 일을하고 싶다. – stone

+0

방금 ​​이렇게 많은 코드가 저장되었습니다. 감사! – MattS423

관련 문제