【问题标题】:Expression Blend WPF Application Can't Change between Defined StatesExpression Blend WPF 应用程序无法在定义的状态之间更改
【发布时间】: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 代码移动到您的顶级 GridPanel 下方。如果这不起作用,请再次删除 Triggers 和 CustumVisualStateMananger 测试,然后重新添加,直到问题突出显示
  • 我也试过了。但实际上我根本不确定我必须将 VisualStateManager 移动到哪里,因为我有多个网格。 'dropbox.com/s/9tj7uirfnihkg1g/Weather.zip?dl=0'。但也许这毕竟不是问题。在链接下你可以看到整个代码,也许这可以澄清什么是真正的错误。会继续尝试任何事情!
  • 我想的另一件事:为什么我不能只使用不同的情节提要,并且取决于我想看的情节提要(例如 SunAnimation、RainAnimation),我会将相应情节提要的不透明度设置为 100 %。但是这里的问题是我还没有想出如何将 Storyboard 的不透明度从后面的代码中更改为 0 或 100。如果我能做到这一点,那么我根本不需要州吗?跨度>

标签: c# wpf xaml expression-blend


【解决方案1】:

再次查看您的代码,因为无法看到状态更改不起作用的原因。 认为这会有所帮助。 首先将您的 VisualStateManager 和 VisualStates 移动到 Grid LayoutRoot 下方,例如

<Grid x:Name="LayoutRoot" Background="Black" Width="960" Height="540" DataContext="{Binding Source={StaticResource SampleWeatherData}}">
    <VisualStateManager.VisualStateGroups>
         <VisualStateGroup x:Name="WeatherStates">
            //all your other VisualStates
    </VisualStateManager.VisualStateGroups>...

然后将您的代码稍微更改为

void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    VisualStateManager.GoToElementState(LayoutRoot, "Sunny", true);
}

编辑不确定您是否必须执行此答案的第一阶段。测试一下,让我知道

我认为这应该可行。总账

【讨论】:

  • 现在就像一个魅力。正如您所说,指定从哪个 FrameworkElement(此处为 LayoutRoot)调用更改状态函数非常重要。还需要调用函数GoToElementState 而不是GoToState。非常感谢,非常感谢!!!!!!
  • 这是个好消息。你能把它标记为正确答案吗:)
  • 是的,我会的。抱歉直到现在才回复!!!所以我想我现在标记了它(这是你的意思吗?):-) 我还能以某种方式评价你(你的个人资料)吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多