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 -->