C# 为多个VisualState组实现VisualState的正确方法是什么?
这个问题是关于C# 为多个VisualState组实现VisualState的正确方法是什么?,c#,wpf,xaml,visualstatemanager,visualstates,C#,Wpf,Xaml,Visualstatemanager,Visualstates,这个问题是关于VisualStates如何在WPF中工作的后续问题 目前,我的理解是,在不同的VisualStateGroup中设置相同属性的动画可能会导致问题(请参见链接问题) 为了解决这些问题,需要利用环孔。(可能“环孔”不是正确的术语,但似乎解决方案并不是WPF设计者想要的。) 我想知道在多个VisualStateGroup中设置同一属性动画的正确方法是什么,而不会产生不良副作用。如果不可能,实现控件相同视觉行为的正确途径是什么? 我可以在以下位置找到一些相关文档: 每个组的控件始终处于一
VisualStates
如何在WPF中工作的后续问题
目前,我的理解是,在不同的VisualStateGroup
中设置相同属性的动画可能会导致问题(请参见链接问题)
为了解决这些问题,需要利用环孔。(可能“环孔”不是正确的术语,但似乎解决方案并不是WPF设计者想要的。)
我想知道在多个VisualStateGroup
中设置同一属性动画的正确方法是什么,而不会产生不良副作用。如果不可能,实现控件相同视觉行为的正确途径是什么?
我可以在以下位置找到一些相关文档:
每个组的控件始终处于一种状态。例如,即使鼠标指针不在按钮上方,按钮也可以具有焦点,因此处于焦点状态的按钮可以处于鼠标悬停、按下或正常状态
这就引出了第二个问题
如何提供仅当两个特定的VisualStates
处于活动状态时才会出现的可视行为?
例如,一个切换按钮
:
- 如果按钮被选中,我想显示行为1
- 如果按钮被禁用,我想显示行为2
- 最后,如果按钮被选中并且被禁用,我想显示行为3
在上面的示例中,您将如何渲染第三种视觉行为?对于问题的第一部分,您希望每个状态都与每个不同的单独对象交互,而不是与每个VisualState使用相同的对象,例如
<VisualState x:Name="Disabled">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="DisabledState"
Storyboard.TargetProperty="(UIElement.Visibility)">
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Checked">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckedState"
Storyboard.TargetProperty="(UIElement.Visibility)">
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<!-- Each state interacts with its own object in your ControlTemplate ideally -->
<Border x:Name="CheckedState" Visibility="Collapsed"
Background="Green"/>
<Border x:Name="DisabledState" Visibility="Collapsed"
Background="White" Opacity=".5"/>
因此,您可以玩不同的游戏、生成的持续时间等。您应该使用Blend。感谢您的回答,它非常有用。由于要更改可见性,因此视觉行为会立即发生。如果我需要进行渐变,这是否意味着我必须设置不透明度的动画?不,您可以只设置
持续时间
,例如DiscreteObjectKeyFrame Duration=“0:0:5”
或任何适合您的设置。能见度改变而不是不透明度更好。啊,我想一定是误解了。Duration
属性实际上属于ObjectAnimationUsingKeyFrames
。不幸的是,这并不会导致慢慢出现在视野中的渐进效果。老实说,我不知道WPF将如何处理逐渐切换到可见性。隐藏的或可见性。折叠的。我想修改不透明度是实现我想要的目标的唯一方法。哦,天哪,抱歉,这是我在等待构建时快速回答问题所得到的结果,无论如何,请在几秒钟内查看编辑后的答案,您只需要一个可视化转换
<VisualState x:Name="Disabled">
<Storyboard>
<ColorAnimation d:IsOptimized="True"
Duration="0"
Storyboard.TargetName="Background"
Storyboard.TargetProperty="(SolidColorBrush.Color)"
To="White" />
</Storyboard>
</VisualState>
<VisualState x:Name="Checked">
<Storyboard>
<ColorAnimation d:IsOptimized="True"
Duration="0"
Storyboard.TargetName="Background"
Storyboard.TargetProperty="(SolidColorBrush.Color)"
To="Green" />
</Storyboard>
</VisualState>
<Border x:Name="Background" Background="Blue"/>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition From="Normal"
GeneratedDuration="0:0:0.2"
To="Checked">
<VisualTransition.GeneratedEasingFunction>
<ExponentialEase EasingMode="EaseIn" Exponent="7" />
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
<VisualTransition From="Checked"
GeneratedDuration="0:0:0.2"
To="Normal">
<VisualTransition.GeneratedEasingFunction>
<CircleEase EasingMode="EaseIn" />
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<!-- etc, etc, etc -->