2016-10-10 29 views
0

我一直在試圖讓一個WPF多datatrigger就觸發基於此控制http://marcangers.com/animated-switch-togglebutton-style-in-wpf/對定製的切換按鈕故事板動畫作品。切換按鈕是常規WPF ToggleButton的擴展,具有Status的自定義屬性,該屬性將顯示爲Modified或Unmodified。我的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

由於'namecope'問題,'ElementName'是你的第一個案例中的問題。 – AnjumSKhan

+0

你們兩個都是對的,我忘記了我們在一個不同的控制中做了類似的事情,並將別人稱爲我自己=自我。通過執行'RelativeSource = {RelativeSource Self}'它可以工作。感謝所有的幫助! – CGideon

回答

1

我無法找到你的XAML Myself的定義。

如果這是Style.Triggers(我敢肯定它是),我會認爲結合Status應該是{Binding Status, RelativeSource={RelativeSource Self},就像你IsChecked結合。

如果我錯了,它在ControlTemplate.Triggers,我會嘗試{Binding Status, RelativeSource={RelativeSource TemplatedParent} - 和IsChecked相同。

+0

對,就是我自己。通過將其更改爲RelativeSource = {RelativeSource Self}它可以工作。 – CGideon

0

的問題是與<Condition Binding="{Binding Status,ElementName=Myself}" Value="Modified"/>所有我所要做的就是將其切換到<Condition Binding="{Binding Status, RelativeSource={RelativeSource=Self}}" Value="Modified"/>

這一變動修正樣式觸發器。