【问题标题】:WPF Stop Storyboard on Visibility ChangedWPF 在可见性上停止情节提要已更改
【发布时间】:2011-01-01 20:46:36
【问题描述】:

我有一个带有故事板的用户控件,我想在控件的可见性更改时停止动画。

我创建了一个触发器来暂停动画并根据状态启动它,但我不断收到 ArgumentException。

这是 XAML:

<UserControl.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard x:Name="ProgressAnimation_BeginStoryboard" Storyboard="{StaticResource ProgressAnimation}"/>
    </EventTrigger>
    <Trigger Property="Control.Visibility" Value="Collapsed">
        <PauseStoryboard BeginStoryboardName="ProgressAnimation_BeginStoryboard" />
    </Trigger>
    <Trigger Property="Control.Visibility" Value="Visible">
        <ResumeStoryboard BeginStoryboardName="ProgressAnimation_BeginStoryboard" />
    </Trigger>
</UserControl.Triggers>

这里是例外:

值“System.Windows.Media.Animation.PauseStoryboard”不是“System.Windows.SetterBase”类型,不能在此通用集合中使用。 参数名称:值

我将如何在 XAML 中执行此操作?

谢谢, 劳尔

【问题讨论】:

    标签: wpf xaml triggers visibility storyboard


    【解决方案1】:

    您可以使用控制模板来做到这一点:

    <ControlTemplate>
        ... Control stuff here
    
        <ControlTemplate.Triggers>
            <Trigger Property="Visibility" Value="Visible">
                <Trigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource AnimationStoryboard}" x:Name="AnimationBeginStoryboard"/>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="AnimationBeginStoryboard"/>
                </Trigger.ExitActions>
            </Trigger>
        </ControlTemplate.Triggers>
    
    </ControlTemplate>
    

    【讨论】:

    • 这不是一个很好的问题解决方案,因为使用这种方式无法暂停和恢复动画。
    【解决方案2】:

    看看这个sample from MSDN

    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
     <StackPanel>
      <Rectangle Name="TargetRect" Width="200" Height="200" Fill="Blue"/>
      <Button Name="Begin">BeginStoryboard</Button>
      <Button Name="Pause">PauseStoryboard</Button>
      <Button Name="Resume">ResumeStoryboard</Button>
      <StackPanel.Triggers>
       <EventTrigger SourceName="Begin" RoutedEvent="Button.Click">
        <BeginStoryboard Name="ColorStoryboard">
         <Storyboard TargetName="TargetRect">
          <ColorAnimation Storyboard.TargetProperty="Fill.Color" To="Red" Duration="0:0:3" RepeatBehavior="Forever" AutoReverse="True"/>
         </Storyboard>
        </BeginStoryboard>
       </EventTrigger>
       <EventTrigger SourceName="Pause" RoutedEvent="Button.Click">
        <PauseStoryboard BeginStoryboardName="ColorStoryboard"/>
       </EventTrigger>
       <EventTrigger SourceName="Resume" RoutedEvent="Button.Click">
        <ResumeStoryboard BeginStoryboardName="ColorStoryboard"/>
       </EventTrigger>
      </StackPanel.Triggers>
     </StackPanel>
    </Page>
    

    我能看到的唯一区别是他们在这里使用EventTrigger,但它的行为应该相同,至少在我的经验中。

    【讨论】:

    • 这行不通,因为当我需要 时,UserControl 只能包含 EventTriggers。
    猜你喜欢
    • 2014-04-19
    • 2011-01-23
    • 2020-08-06
    • 2011-01-16
    • 1970-01-01
    • 2018-12-18
    • 2011-08-03
    • 1970-01-01
    • 2022-10-20
    相关资源
    最近更新 更多