如果我理解正确的话您的问题:
- 当你得到一个鼠标放在你身边的菜单中输入事件时,从动画(如“ShowMenuStoryboard”)。
- 然后,您希望“HideMenuStoryboard”将菜单滑回,但只有在触发后(通过MouseLeave事件发生)才开始更改20秒,但如果后续的Mouse Enter事件触发,则需要取消它。
- 你想要做所有这些都没有代码隐藏逻辑。
有2件事情要做。
- 确保你的故事板只有指定的结束状态值(不含起始状态)和
你只需要设置的BeginTime =“0:0:20”中的XAML的HideStoryboard例如
<故事板X:NAME = “HideMenuStoryboard” 的BeginTime = “0:0:20” >
我还没有找到的BeginTime在Expression Blend中编辑的任何位置的属性,所以这在XAML视图中完成。这些属性仅显示AutoReverse和RepeatBehavior。
这种动画存在固有的问题,但应该适用于您的示例。持续时间是固定的,所以如果您在开始时触发相反的动画,则实际上动画会更缓慢地移动到最终位置,因为需要一段固定的时间才能从“当前位置”移动到最终位置。
希望这会有所帮助。下面是带有菜单菜单的完整示例MainPage.XAML。它仅需要2个故事板和故事板控制行为:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
x:Class="SilverlightApplication1.MainPage"
mc:Ignorable="d">
<UserControl.Resources>
<Storyboard x:Name="ShowMenuStoryboard">
<DoubleAnimation Duration="0:0:0.5" To="0" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="stackPanel" d:IsOptimized="True"/>
</Storyboard>
<Storyboard x:Name="HideMenuStoryboard" BeginTime="0:0:20">
<DoubleAnimation Duration="0:0:0.5" To="-100" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="stackPanel" d:IsOptimized="True"/>
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel x:Name="stackPanel" HorizontalAlignment="Left" Orientation="Vertical" Width="150" d:LayoutOverrides="Height" RenderTransformOrigin="0.5,0.5" Background="#FF646CE7">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeave">
<ei:ControlStoryboardAction Storyboard="{StaticResource HideMenuStoryboard}"/>
</i:EventTrigger>
<i:EventTrigger EventName="MouseEnter">
<ei:ControlStoryboardAction Storyboard="{StaticResource ShowMenuStoryboard}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<StackPanel.RenderTransform>
<CompositeTransform TranslateX="-100"/>
</StackPanel.RenderTransform>
<StackPanel.Projection>
<PlaneProjection/>
</StackPanel.Projection>
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
</StackPanel>
</Grid>
</UserControl>
嗯,那就是我正在寻找的东西 - 我读了Storyboard动画,现在这一切都很有意义 - 感谢这个伟大的例子。 一些问题: 所以在我的例子中 - 我使用2个不同的“国家”,并使用触发器来激活一个到另一个。在你的例子中,你使用SB并改变X的位置来移动它 - 我只使用状态,因为这是Blend教程的开始 - 你可以使用Storyboard在不同的状态之间切换状态吗?你会在哪些地方使用这个方法? 感谢您的帮助! – Rodney 2010-08-19 09:02:43
您好,这是另一种方式:您可以通过控件中的逻辑或通过外部行为(如GoToStateAction行为)在状态之间转换。故事板只是为了在各种控制状态之间提供良好的转换。您应该能够将开始时间插入到转换中,但不能确定没有看到您的示例。如果您想要修正某个特定示例,您可以随时通过我们的网站与我们联系。 (我现在将添加一个WP联系人页面)。欢呼 – 2010-08-19 16:27:48