1

如果密码不正确,我正在尝试设置 a 的视觉状态PasswordBox以指示错误。

根据 MSDN 文档PasswordBox Syles and Templates(他们的拼写错误),在以下视觉状态组中定义了以下视觉状态:

  • 正常 - CommonStates
  • 鼠标悬停 - CommonStates
  • 已禁用 - CommonStates
  • 专注 - FocusStates
  • 不专心 - FocusStates
  • 有效 - ValidationStates
  • InvalidFocused - ValidationStates
  • InvalidUnfocused - ValidationStates

但是,以下代码总是返回一个空列表:

public void Blah(PasswordBox passwordBox)
{
     var visualStateGroups = VisualStateManager.GetVisualStateGroups(passwordBox);
     //visualStates.Count is always 0.
}

并且试图进入一个状态总是返回错误,例如

public void Halb(PasswordBox passwordBox)
{
   bool didTransition = VisualStateManager.GoToState(passwordBox, 
                                                    "InvalidFocused", 
                                                     true);

   //didTransition is always false. It doesn't make a difference whether
   //or not the last paramter is "true" or "false"
}

为什么在 msdn 上记录的 VisualStates/VisualStateGroups 显然在代码中丢失了?我做错了什么(我的怀疑),还是 MSDN 不正确?

4

1 回答 1

0

您问题答案的第一部分在 MSDN VisualStateManager.GetVisualStateGroups评论中

“VisualStateGroups 通常设置在元素可视化树的根部,而不是元素本身。”

所以

public void Blah(PasswordBox passwordBox)
{
    var bd = pbox.Template.FindName("Bd", pbox) as FrameworkElement;
    var visualStateGroups = VisualStateManager.GetVisualStateGroups(bd);
    Debug.WriteLine(visualStateGroups.Count);
    // should print 3
}

至于第二部分,这对我来说很好,

如果我定义 VSG,例如

<VisualStateManager.VisualStateGroups>
  <VisualStateGroup x:Name="CommonStates" />
  <VisualStateGroup x:Name="FocusStates" />
  <VisualStateGroup x:Name="ValidationStates">
    <VisualState x:Name="Valid" />
    <VisualState x:Name="InvalidFocused">
      <Storyboard>
        <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_ContentHost"
                                      Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
          <EasingColorKeyFrame KeyTime="0"
                                Value="#FF9B4A4A" />
        </ColorAnimationUsingKeyFrames>
      </Storyboard>
    </VisualState>
    <VisualState x:Name="InvalidUnfocused" />
  </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

现在VisualStateManager.GoToState(passwordBox, "InvalidFocused", true);返回true,我可以看到相应样式的控件。

更新:

AFAIK 认为它只是在 SilverlightVisualState中自动定义为PasswordBox. 在 WPF 中,您必须自己定义它们。表达式混合通过在 IDE 选项卡中为您提供状态稍有帮助,States当您记录更改时,它会自动生成伴随Storyboard的代码,但在您编辑的情况下并非Template如此。

如此处所述,猜测这只是因为 WPF 中的默认样式不使用开箱即用的 VSM。

下载指向示例的链接,其中“我们”显式定义了 VSM 和VisualState's 以及PasswordBox我发布的之前的两个函数最初显示有效。

于 2013-06-25T00:21:04.627 回答