【发布时间】:2015-05-13 09:11:36
【问题描述】:
在我在Expression Blend 中完成的 WPF 应用程序中,我定义了一些状态(如“SunAnimation”、“SnowAnimation”等)。现在,如果我在程序未运行时(在设计模式下)在这些状态之间切换,一切正常。但是当我运行程序并尝试使用VisualStateManager.GoToState(...) 更改状态时,它根本不起作用。
我在后面文件中的代码是
void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
VisualStateManager.GoToState(this, Dynamic_State.Text.ToString(), true);
}
Dynamic_State 是一个 TextBlock,其中状态的名称会根据 ComboBox 中的选择自动加载(通过 DataBinding)。
在 WPF 文件中,我定义了几个故事板,如下所示:
<Storyboard x:Key="SunAnimation" RepeatBehavior="Forever">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="Rays">
<EasingDoubleKeyFrame KeyTime="0:0:4" Value="36"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[2].(GradientStop.Offset)" Storyboard.TargetName="ellipse">
<EasingDoubleKeyFrame KeyTime="0" Value="0.95"/>
<EasingDoubleKeyFrame KeyTime="0:0:2" Value="0.221"/>
<EasingDoubleKeyFrame KeyTime="0:0:4" Value="0.95"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
我还定义了一些ControlStoryboardAction 的东西(根据教程,但我不确定这是否有用或是否有必要......)以及一个看起来像下面的VisualStateGroups :
<i:Interaction.Triggers>
<i:EventTrigger>
<ei:ControlStoryboardAction Storyboard="{StaticResource SunAnimation}"/>
<ei:ControlStoryboardAction Storyboard="{StaticResource RainAnimation}"/>
<ei:ControlStoryboardAction Storyboard="{StaticResource CloudAnimation}"/>
<ei:ControlStoryboardAction Storyboard="{StaticResource SnowAnimation}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<VisualStateManager.CustomVisualStateManager>
<ei:ExtendedVisualStateManager/>
</VisualStateManager.CustomVisualStateManager>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="WeatherStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="None"/>
<VisualState x:Name="Sunny">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Sun">
<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Rainy">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Rain">
<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Sun">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
</DoubleAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="WeatherGrid">
<EasingColorKeyFrame KeyTime="0" Value="#FF00427A"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="WeatherGrid">
<EasingColorKeyFrame KeyTime="0" Value="#FF637685"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Cloudy">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="clouds">
<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Snowy">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="snowflakes">
<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
</DoubleAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="path6">
<EasingColorKeyFrame KeyTime="0" Value="#FF9EA19F"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="path7">
<EasingColorKeyFrame KeyTime="0" Value="#FF9EA19F"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="path8">
<EasingColorKeyFrame KeyTime="0" Value="#FF9EA19F"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="path9">
<EasingColorKeyFrame KeyTime="0" Value="#FF9EA19F"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="path6">
<EasingColorKeyFrame KeyTime="0" Value="White"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="path7">
<EasingColorKeyFrame KeyTime="0" Value="White"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="path8">
<EasingColorKeyFrame KeyTime="0" Value="White"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="path9">
<EasingColorKeyFrame KeyTime="0" Value="White"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
任何想法我做错了什么?
【问题讨论】:
-
您是否尝试过手动添加状态,例如 VisualStateManager.GoToState(this, "Sunny" , true);如果它仍然不起作用,则可能是 'WeatherStates' VisualStateGroup 的位置
-
是的,我已经尝试过了。仍然不起作用...'WeatherStates' VisualStateGroup 的位置是什么意思?
-
尝试将 VisualStatManager 代码移动到您的顶级
Grid或Panel下方。如果这不起作用,请再次删除 Triggers 和 CustumVisualStateMananger 测试,然后重新添加,直到问题突出显示 -
我也试过了。但实际上我根本不确定我必须将 VisualStateManager 移动到哪里,因为我有多个网格。 'dropbox.com/s/9tj7uirfnihkg1g/Weather.zip?dl=0'。但也许这毕竟不是问题。在链接下你可以看到整个代码,也许这可以澄清什么是真正的错误。会继续尝试任何事情!
-
我想的另一件事:为什么我不能只使用不同的情节提要,并且取决于我想看的情节提要(例如 SunAnimation、RainAnimation),我会将相应情节提要的不透明度设置为 100 %。但是这里的问题是我还没有想出如何将 Storyboard 的不透明度从后面的代码中更改为 0 或 100。如果我能做到这一点,那么我根本不需要州吗?跨度>
标签: c# wpf xaml expression-blend