首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动画IsChecked属性?

如何动画IsChecked属性?
EN

Stack Overflow用户
提问于 2011-02-07 04:21:18
回答 2查看 7.3K关注 0票数 6

我有带有ToggleButtons号码的自定义控件:

代码语言:javascript
复制
<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>

和故事板:

代码语言:javascript
复制
  <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>

当我的控件处于中止状态时,按钮中止正在闪烁,但当我将状态更改为中止时,会引发错误:

'System.Windows.Controls.Primitives.ToggleButton‘上的“IsChecked”属性不能使用'System.Windows.Media.Animation.ObjectAnimationUsingKeyFrames’动画

如何使用三个值之间的Storyboard来动画这个属性:true, false and {x:Null},而不仅仅是true and false

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-16 08:39:46

问题是,您不应该使用ObjectAnimationUsingKeyFrames动画来真正设置布尔值,而应该是带有DiscreteBooleanKeyFrame关键帧的BooleanAnimationUsingKeyFrames动画。

所以你的标记是:

代码语言:javascript
复制
<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>
票数 12
EN

Stack Overflow用户

发布于 2011-02-08 06:55:59

我找到了解决办法。如果你想放屁的话?在XAML中,您应该这样做:

代码语言:javascript
复制
<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>
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4918039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档