C# 如何设置IsChecked属性的动画?
我有一些带有切换按钮的自定义控件:C# 如何设置IsChecked属性的动画?,c#,.net,wpf,visual-studio-2010,.net-4.0,C#,.net,Wpf,Visual Studio 2010,.net 4.0,我有一些带有切换按钮的自定义控件: <Style TargetType="{x:Type local:ISA88Buttons}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type local:ISA88Buttons}"> <Border x:Name="PART_Bord
<Style TargetType="{x:Type local:ISA88Buttons}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ISA88Buttons}">
<Border x:Name="PART_Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ISA88States">
...
<VisualState x:Name="AbortingState" Storyboard="{StaticResource sbAbortingState}" />
<VisualState x:Name="AbortedState" Storyboard="{StaticResource sbAbortedState}" />
...
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<StackPanel Margin="1"
HorizontalAlignment="Center"
Orientation="Horizontal">
...
<ToggleButton x:Name="PART_Button_Abort"
Margin="1"
IsChecked="False"
IsThreeState="True"
Tag="Abort">
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border x:Name="border"
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}"
Background="{StaticResource NormalAbortButtonDrawingBrush}" />
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Background" Value="{StaticResource DisabledAbortButtonDrawingBrush}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="{StaticResource MouseOverAbortButtonDrawingBrush}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsEnabled" Value="True" />
<Condition Property="IsChecked" Value="True" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter TargetName="border" Property="Background" Value="{StaticResource PressedAbortButtonDrawingBrush}" />
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsEnabled" Value="True" />
<Condition Property="IsChecked" Value="{x:Null}" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard x:Name="sb">
<Storyboard RepeatBehavior="Forever">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="border" Storyboard.TargetProperty="Background">
<DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{StaticResource PressedAbortButtonDrawingBrush}" />
<DiscreteObjectKeyFrame KeyTime="00:00:0.25" Value="{StaticResource NormalAbortButtonDrawingBrush}" />
<DiscreteObjectKeyFrame KeyTime="00:00:0.5" Value="{StaticResource PressedAbortButtonDrawingBrush}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.EnterActions>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
</ToggleButton>
...
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
...
...
...
...
故事板:
<Storyboard x:Key="sbAbortingState">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Button_Abort" Storyboard.TargetProperty="(ToggleButton.IsChecked)">
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Null}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="sbAbortedState">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Button_Abort" Storyboard.TargetProperty="(ToggleButton.IsChecked)">
<DiscreteObjectKeyFrame KeyTime="0" Value="True" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
当我的控件处于中止状态时,按钮中止闪烁,但当我将状态更改为中止时,错误为:
无法设置“IsChecked”的动画
土地上的财产
'System.Windows.Controls.Primitives.ToggleButton'
使用
'System.Windows.Media.Animation.ObjectAnimationUsingKeyFrames'
如何在三个值之间使用故事板设置此属性的动画:
true、false和{x:Null}
,而不仅仅是true和false
,我找到了解决方案。如果你想设置布尔?属性,您应该这样做:
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Button" Storyboard.TargetProperty="(ToggleButton.IsChecked)">
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Null}" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Button" Storyboard.TargetProperty="(ToggleButton.IsChecked)">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>True</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Button" Storyboard.TargetProperty="(ToggleButton.IsChecked)">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>False</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
真的
假的
问题在于,您不应该真正使用ObjectAnimationUsingKeyFrames动画设置布尔值,而应该是一个带有离散布尔关键帧的BooleanAnimationUsingKeyFrames动画
因此,您的标记将是:
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="Button" Storyboard.TargetProperty="(ToggleButton.IsChecked)">
<DiscreteBooleanKeyFrame KeyTime="0" Value="{x:Null}" />
</BooleanAnimationUsingKeyFrames>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="Button" Storyboard.TargetProperty="(ToggleButton.IsChecked)">
<DiscreteBooleanKeyFrame KeyTime="0" Value="True" />
</BooleanAnimationUsingKeyFrames>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="Button" Storyboard.TargetProperty="(ToggleButton.IsChecked)">
<DiscreteBooleanKeyFrame KeyTime="0" Value="False" />
</BooleanAnimationUsingKeyFrames>
请使用BooleanAnimationUsingKeyFrames查看答案,这是正确的方法。@ChuckRostance:您不能将{x:Null}
与BooleanAnimationUsingKeyFrames
一起使用。另一个答案是建议使用它,但它并不像声称的那样有效,但上面的答案确实有效。既然OP是写这个答案的人,他们应该将这个标记为已接受,而不是另一个。为什么我们需要这个
?因为bool默认值为false问题询问如何在三种状态之间设置动画,所以我提供了这样做的标记。如果您认为您的特定应用程序不需要它,那么可以在不使用代码的情况下尝试它-更少的代码更好!我在调查一个相关但不同的问题时遇到了这个答案,我被上面的代码弄糊涂了。特别是,我不知道如何让Value=“{x:Null}”
工作。当我尝试这样做时,我在XAML中得到一个错误:“Boolean”类型不支持空值。”
这对我来说很有意义,因为Value
属性具有typebool
,而不是bool?
(即Nullable
)。上述措施如何发挥作用?实际上有没有一种方法可以设置一个可为空的布尔值的动画?FWIW:在应用对象动画时,可以使用关键帧
,如另一个答案中所述。我不明白你是如何让上述代码发挥作用的。请将你接受的答案更改为你发布的答案,而不是你现在标记为接受的答案。这将帮助其他人找到实际可行的解决方案。当前接受的答案不起作用,也不能起作用。