2016-10-10 3 views
0

Я пытался получить многопроцессорный многопроцессор WPF для работы над запуском анимации раскадровки на настраиваемом ToggleButton на основе этого элемента управления http://marcangers.com/animated-switch-togglebutton-style-in-wpf/. Кнопка переключения является расширением обычного WPF ToggleButton с пользовательским атрибутом статуса, который либо будет отображаться как измененный или немодифицированный. Мой MultiDataTrigger запускает включение или выключение togglebutton 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(); 
    } 
} 

А вот мои Multidata спусковые в 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> 

Я не уверен, что я m делать неправильно, используя обычный триггер, заставляет анимацию работать. Вот вам триггер.

<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' - проблема в вашем первом случае из-за проблем с именами. – AnjumSKhan

+0

Вы оба правы, я забыл, что мы сделали что-то похожее на это в другом контроле и aliased Myself = Self. Выполняя 'RelativeSource = {RelativeSource Self}', он работает. Спасибо за помощь! – CGideon

ответ

1

Я не могу найти определение для Myself в вашем XAML.

Если это в 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"/>

Это изменение фиксирует стайлинга триггеров.