2016-10-10 13 views
0

이 컨트롤 http://marcangers.com/animated-switch-togglebutton-style-in-wpf/을 기반으로하는 사용자 지정된 ToggleButton에서 스토리 보드 애니메이션을 트리거하기 위해 WPF 다중 데이터 트리거를 가져 오려고했습니다. 토글 버튼은 사용자 정의 속성이 Status 인 Modified 또는 Unmodified로 표시되는 일반 WPF ToggleButton의 확장입니다. 내 MultiDataTrigger는 토글 버튼 IsChecked와 상태가 수정되었는지 또는 수정되지 않은지 여부를 트리거합니다. 문제는 스토리 보드가 전혀 작동하지 않는다는 것입니다. 스토리 보드 애니메이션을 정기적으로 트리거 할 때 잘 작동합니다. 다음은 맞춤 토글 버튼입니다.WPF MultiDataTrigger.EnterAction이 사용자 지정 특성과 작동하지 않습니다.

CustomToggleButton.xaml

<ToggleButton x:Class="DPC9600CustomControlLibrary.CustomToggleButton" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:ControlLibrary" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
    <ToggleButton.Resources> 
     <ResourceDictionary Source="Themes/Styles_CustomToggleButton.xaml"/> 
    </ToggleButton.Resources> 
    <ToggleButton.Style> 
     <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource CustomToggleButton}"/> 
    </ToggleButton.Style> 
</ToggleButton> 

CustomToggleButton.xaml.cs

여기
public partial class CustomToggleButton : ToggleButton 
{ 
    public static readonly DependencyProperty StatusProperty = 
     DependencyProperty.Register("Status", typeof(ConfigurationValueStatus), typeof(CustomToggleButton)); 



    public ConfigurationValueStatus Status 
    { 
     get { return (ConfigurationValueStatus) GetValue(StatusProperty); } 
     set { SetValue(StatusProperty, value); } 
    } 

    public CustomToggleButton() 
    { 
     InitializeComponent(); 
    } 
} 

그리고 내가 '무엇 확실하지 않다 Styles_CustomToggleButton.xaml

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Value="True"/> 
     <Condition Binding="{Binding Status,ElementName=Myself}" Value="Unmodified"/> 
    </MultiDataTrigger.Conditions> 
    <MultiDataTrigger.EnterActions> 
     <BeginStoryboard> 
      <Storyboard> 
       <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#FF377EC1" Duration="0:0:0.2" /> 
       <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#FF377EC1" Duration="0:0:0.2" /> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse"> 
        <SplineDoubleKeyFrame KeyTime="0" Value="0"/> 
        <SplineDoubleKeyFrame KeyTime="0:0:0.4" Value="15" KeySpline="0, 1, 0.6, 1"/> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </MultiDataTrigger.EnterActions> 
    <MultiDataTrigger.ExitActions> 
     <BeginStoryboard> 
      <Storyboard> 
       <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#FAFAFB" Duration="0:0:0.2" /> 
       <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#EAEAEB" Duration="0:0:0.2" /> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse"> 
        <SplineDoubleKeyFrame KeyTime="0" Value="15"/> 
        <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="0" KeySpline="0, 0.5, 0.5, 1"/> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </MultiDataTrigger.ExitActions> 
</MultiDataTrigger> 
<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Value="True"/> 
     <Condition Binding="{Binding Status,ElementName=Myself}" Value="Modified"/> 
    </MultiDataTrigger.Conditions> 
    <MultiDataTrigger.EnterActions> 
     <BeginStoryboard> 
      <Storyboard> 
       <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Goldenrod" Duration="0:0:0.2" /> 
       <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="Goldenrod" Duration="0:0:0.2" /> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse"> 
        <SplineDoubleKeyFrame KeyTime="0" Value="0"/> 
        <SplineDoubleKeyFrame KeyTime="0:0:0.4" Value="15" KeySpline="0, 1, 0.6, 1"/> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </MultiDataTrigger.EnterActions> 
    <MultiDataTrigger.ExitActions> 
     <BeginStoryboard> 
      <Storyboard> 
       <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#FAFAFB" Duration="0:0:0.2" /> 
       <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#EAEAEB" Duration="0:0:0.2" /> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse"> 
        <SplineDoubleKeyFrame KeyTime="0" Value="15"/> 
        <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="0" KeySpline="0, 0.5, 0.5, 1"/> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </MultiDataTrigger.ExitActions> 
</MultiDataTrigger> 

내 멀티 트리거입니다 잘못된 일을하는 경우 일반 트리거를 사용하면 애니메이션이 작동합니다. 방아쇠를 살펴 봅시다.

<Trigger Property="IsChecked" Value="true" > 
    <Trigger.EnterActions> 
     <BeginStoryboard> 
      <Storyboard> 
       <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#FF377EC1" Duration="0:0:0.2" /> 
       <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#FF377EC1" Duration="0:0:0.2" /> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse"> 
        <SplineDoubleKeyFrame KeyTime="0" Value="0"/> 
        <SplineDoubleKeyFrame KeyTime="0:0:0.4" Value="15" KeySpline="0, 1, 0.6, 1"/> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <BeginStoryboard> 
      <Storyboard> 
       <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#FAFAFB" Duration="0:0:0.2" /> 
       <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#EAEAEB" Duration="0:0:0.2" /> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse"> 
        <SplineDoubleKeyFrame KeyTime="0" Value="15"/> 
        <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="0" KeySpline="0, 0.5, 0.5, 1"/> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </Trigger.ExitActions> 
</Trigger> 
+3

어떻게 그리고 '어디서'정의되어 있습니까? 나는'Status'에 대한 바인딩이 {Binding Status, RelativeSource = {RelativeSource Self}'(또는'RelativeSource TemplatedParent'가'ControlTemplate'에있는 경우)라고 생각하지만, 뭔가 빠졌을 수도 있습니다. –

+1

'ElementName'은'namescope' 문제 때문에 첫 번째 경우에 문제가됩니다. – AnjumSKhan

+0

당신은 둘 다 맞습니다. 저는 우리가 다른 컨트롤에서 비슷한 것을 한 것을 잊어 버렸습니다. 'RelativeSource = {RelativeSource Self}'를 실행하면 작동합니다. 모든 도움에 감사드립니다! – CGideon

답변

1

XAML에서 Myself에 대한 정의를 찾을 수 없습니다.

이 (나는 그것이 확신) Style.Triggers에 있다면, 난 그냥 당신의 IsChecked 같은 Status에 바인딩해야 {Binding Status, RelativeSource={RelativeSource Self}이 바인딩 생각합니다.

내가 틀렸어 그것이 ControlTemplate.Triggers 인 경우, {Binding Status, RelativeSource={RelativeSource TemplatedParent} - 그리고 IsChecked과 동일하게 시도 할 것입니다.

+0

맞아, 나 자신이었다. RelativeSource = {RelativeSource Self}로 변경하면 작동합니다. – CGideon

0

문제는 내가했던 일은,이 변화는 스타일 트리거를 해결 <Condition Binding="{Binding Status, RelativeSource={RelativeSource=Self}}" Value="Modified"/>

로 전환했다 <Condition Binding="{Binding Status,ElementName=Myself}" Value="Modified"/>로했다.