【问题标题】:How to disable/enable a VisualState based on some condition? (Metro)如何根据某些条件禁用/启用 VisualState? (地铁)
【发布时间】:2013-01-28 04:30:03
【问题描述】:

我为控件模板中的按钮定义了一个 VisualState:

  <ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
      ...
      <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="CommonStates">
          ...
          <VisualState x:Name="PointerOver">
            <Storyboard>
              <DoubleAnimation Storyboard.TargetName="c1" Storyboard.TargetProperty="Opacity" To="0.7"/>
            </Storyboard>
          </VisualState>
          ...
        </VisualStateGroup>
      </VisualStateManager.VisualStateGroups>
      ...
  </ControlTemplate>

但是应该根据视图模型条件启用/禁用此效果(鼠标悬停时更改不透明度),那么我该如何使用 XAML 做到这一点?

我尝试为 DoubleAnimation 的 To 值创建绑定,但它不起作用,因为 Storyboard 已冻结。我也在想模板选择器之类的东西,但是VisualState Manager没有这样的东西。

【问题讨论】:

    标签: xaml windows-runtime windows-store-apps visualstatemanager


    【解决方案1】:

    我最近正在和某人讨论这个问题,我可能会在 WinRT XAML 工具包中添加一个通用解决方案来解决这个问题,它的工作方式类似于 WPF 中的 DataTriggers,但现在我只需在您的控件中添加一个 DependencyProperty,将属性绑定到您的视图模型并在值更改时 - 更新视觉状态。

    【讨论】:

    • 感谢您的回复。但是当你说“更新视觉状态”时,你的意思是“切换到另一个视觉状态”还是“改变 VisualStateManager 的逻辑树”。对于前者,它不起作用,因为“PointerOver”状态可以通过鼠标动作触发,所以即使我手动切换到另一个状态,“PointerOver”状态仍然存在,当鼠标移动时它仍然会被触发除非我可以“禁用”它,否则就结束了。对于后者,我需要先在 C# 中找到 VisualState 对象,但它似乎不在可视化树中。 (无法使用按钮上的 GetDescendants() 找到它)
    • 我的意思是“切换到另一个视觉状态”。如果PointerOver 被按钮的逻辑覆盖 - 清除它的Storyboards 并在新的VisualStateGroup 中添加您自己的自定义CustomPointerOver 状态,这会执行您想要的操作,按钮一无所知,因此它不会使用或覆盖它。我认为您不需要在运行时修改 VisualStateGroups 的设置,但 GetDescendants() 仅适用于可视树元素 (UIElements),而 VisualStateManager 不是其中之一。
    • 谢谢。有效!从来没有想过我可以在同一个 VisualStateGroup 中使用混合状态(Button 知道和不知道)。我只需要处理 PointerEntered 事件并根据条件决定是否进入我的 CustomPointerOver 状态。
    猜你喜欢
    • 2015-08-24
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多