大佬教程收集整理的这篇文章主要介绍了wpf – VisualStateManager不能像广告一样工作,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
<Window x:Class="VSMTest.MainWindow" xmlns="http://scheR_288_11845@as.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://scheR_288_11845@as.microsoft.com/winfx/2006/xaml" @R_262_10283@e="MainWindow" Height="350" Width="525"> <Window.resources> <Style TargetType="checkBox"> <Setter Property="Margin" Value="3"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="checkBox"> <Grid x:Name="Root"> <Grid.BACkground> <SolidColorBrush x:Name="brush" Color="White"/> </Grid.BACkground> <VisualStateManager.VisualStateGroups> <VisualStateGroup Name="checkStates"> <VisualStateGroup.Transitions> <VisualTransition To="checked" GeneratedDuration="00:00:03"> <Storyboard Name="checkingStoryboard"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="brush" Storyboard.TargetProperty="Color"> <DiscreteColorKeyFrame KeyTime="0" Value="LightGreen"/> </ColorAnimationUsingKeyFrames> </Storyboard> </VisualTransition> <VisualTransition To="Unchecked" GeneratedDuration="00:00:03"> <Storyboard Name="UncheckingStoryboard"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="brush" Storyboard.TargetProperty="Color"> <DiscreteColorKeyFrame KeyTime="0" Value="LightSalmon"/> </ColorAnimationUsingKeyFrames> </Storyboard> </VisualTransition> </VisualStateGroup.Transitions> <VisualState Name="checked"> <Storyboard Name="checkedStoryboard" Duration="0"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="brush" Storyboard.TargetProperty="Color"> <DiscreteColorKeyFrame KeyTime="0" Value="Green"/> </ColorAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState Name="Unchecked"> <Storyboard Name="UncheckedStoryboard" Duration="0"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="brush" Storyboard.TargetProperty="Color"> <DiscreteColorKeyFrame KeyTime="0" Value="Red"/> </ColorAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <ContentPresenter/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.resources> <StackPanel> <checkBox x:Name="cb1">check Box 1</checkBox> <checkBox x:Name="cb2">check Box 2</checkBox> <checkBox x:Name="cb3">check Box 3</checkBox> </StackPanel> </Window>
>已检查=绿色
>未选中=红色
>检查(转换)=浅绿色
>取消选中(转换)=浅红色
所以,当你检查一个复选框时,你会希望它在很短的时间内变成浅绿色,然后变绿。同样,取消勾选时,您会期望它在短时间内变成浅红色,然后变红。
它通常是这样做的。但不总是。
玩程序足够长(我可以在大约30秒钟内获得),你会发现过渡动画有时在视觉状态下胜过。也就是说,选中时,复选框将继续显示为浅绿色,或未选择时将显示为浅红色。这是一个屏幕截图,说明我的意思,在过渡配置采取的3秒之后,效果很好:
当这种情况发生时,不是因为控件没有成功转换到目标状态。它的意图是处于正确的状态。我通过检查调试器中的以下内容(针对上述屏幕截图记录的具体情况)进行了验证:
var vsgs = VisualStateManager.GetVisualStateGroups(VisualTreeHelper.GetChild(this.cb2,0) as FrameworkElement); var vsg = vsgs[0]; // this is correctly reported as "UnSELEcted" var currentState = vsg.CurrentState.Name;
如果启用跟踪动画,当转换成功完成时,我会得到以下输出:
System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='44177654'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='UncheckedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='6148812'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='UncheckedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='8261103'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='36205315'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='UncheckedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='18626439'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 3 : Storyboard has been removed; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='44177654'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='UncheckedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid' System.Windows.Media.Animation Stop: 3 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='36893403'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='checkingStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='49590434'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='<null>'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 3 : Storyboard has been removed; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='36893403'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='checkingStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid' System.Windows.Media.Animation Stop: 3 : System.Windows.Media.Animation Start: 3 : Storyboard has been removed; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='49590434'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='<null>'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid' System.Windows.Media.Animation Stop: 3 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='16977025'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='checkedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 3 : Storyboard has been removed; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='16977025'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='checkedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid' System.Windows.Media.Animation Stop: 3 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='16977025'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='checkedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 :
当转换无法成功完成时,我会得到以下输出:
System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='44177654'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='UncheckedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='6148812'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='UncheckedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='8261103'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='36205315'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='UncheckedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='18626439'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 3 : Storyboard has been removed; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='44177654'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='UncheckedStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid' System.Windows.Media.Animation Stop: 3 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='36893403'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='checkingStoryboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 : System.Windows.Media.Animation Start: 1 : Storyboard has begun; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='49590434'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; StoryboardName='<null>'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='41837403'; TargetElement.Type='System.Windows.Controls.Grid'; NameScope='<null>' System.Windows.Media.Animation Stop: 1 :
前12行与过渡成功完全相同,但最后10行完全失踪!
我已经阅读了我可以找到的所有VSM文档,并且无法提出这种不规则行为的解释。
首先,我将我的重载项目降级为.NET 3.5,并从CodePlex获取了WPF Toolkit源代码。我将WPF Toolkit项目添加到我的解决方案中,并从Repro项目中添加了一个引用。
接下来,我运行该应用程序,并确保我仍然可以重现这个问题。果然,很容易这样做。
然后我打开了VisualStateManager.cs文件,并开始添加一些诊断在关键的地方,会告诉我什么代码正在运行,什么没有。通过添加这些诊断并将良好转换的输出与不良转换进行比较,我很快就能够识别出自身出现问题时以下代码未运行:
// Hook up generated Storyboard's Completed event handler dynamicTransition.Completed += delegate { if (transition.Storyboard == null || transition.ExplicitStoryboardCompleted) { if (ShouldRunStateStoryboard(control,element,state,group)) { group.StartNewThenStopOld(element,state.Storyboard); } group.RaiseCurrentStateChanged(element,lastState,control); } transition.DynamicStoryboardCompleted = true; };
所以bug的性质从VSM中的一个问题转移到Storyboard.Completed事件中的问题并不总是被提出来。这是我以前遇到过的一个问题,似乎是任何WPF开发人员在做出任何事情,甚至在普通的动画时,甚至是一个非常的焦虑的来源。
在整个过程中,我在WPF Disciples google group发布了我的发现,在这一点上,Pavan Podila回应了这个宝石:
有了这个洞察力,我在VisualStateManager.cs改变了这一行:
group.StartNewThenStopOld(element,transition.Storyboard,dynamicTransition);
为此:
var masterStoryboard = new Storyboard(); if (transition.Storyboard != null) { masterStoryboard.Children.Add(transition.Storyboard); } masterStoryboard.Children.Add(dynamicTransition); group.StartNewThenStopOld(element,masterStoryboard);
而且 – 我看到,我以前不断间歇的责备现在每次都在工作!
以上是大佬教程为你收集整理的wpf – VisualStateManager不能像广告一样工作全部内容,希望文章能够帮你解决wpf – VisualStateManager不能像广告一样工作所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。