PasswordBox Visual States缺少?

时间:2013-06-24 23:29:43

标签: .net wpf c#-4.0

如果密码不正确,我试图设置PasswordBox的可视状态以指示错误。

根据MSDN文档PasswordBox Syles and Templates(其拼写错误),以下可视状态组定义如下:

  • 正常 - CommonStates
  • MouseOver - CommonStates
  • 已禁用 - CommonStates
  • 专注 - FocusStates
  • 不专心 - FocusStates
  • 有效 - ValidationStates
  • InvalidFocused - ValidationStates
  • InvalidUnfocused - ValidationStates

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

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

尝试进入状态总是返回false,例如

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不正确?

1 个答案:

答案 0 :(得分: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认为只是在Silverlight中VisualStatePasswordBox自动定义的States。在WPF中,您必须自己定义它们。通过在IDE的Storyboard选项卡中显示状态,表达式混合稍微有所帮助,当您记录更改时,它会自动为伴随的Template生成代码,但不是没有您编辑那是VisualState

As stated here猜测这只是因为WPF中的默认样式不会使用开箱即用的VSM。

Download link示例“我们”明确定义了VSM,PasswordBox代表{{1}},其中我之前发布的两个函数都显示正常工作。