首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PasswordBox视觉状态丢失了吗?

PasswordBox视觉状态丢失了吗?
EN

Stack Overflow用户
提问于 2013-06-24 23:29:43
回答 1查看 165关注 0票数 1

我正在尝试设置PasswordBox的可视状态,以指示密码不正确时的错误。

根据MSDN文档PasswordBox Syles和模板 (拼写错误他们的),在以下可视状态组中定义了下列可视状态:

  • 正常- CommonStates
  • MouseOver - CommonStates
  • 残疾- CommonStates
  • 聚焦- FocusStates
  • 非聚焦- FocusStates
  • 有效- ValidationStates
  • InvalidFocused - ValidationStates
  • InvalidUnfocused - ValidationStates

然而,以下代码始终返回一个空列表:

代码语言:javascript
运行
复制
public void Blah(PasswordBox passwordBox)
{
     var visualStateGroups = VisualStateManager.GetVisualStateGroups(passwordBox);
     //visualStates.Count is always 0.
}

尝试进入一个状态总是会返回false。

代码语言:javascript
运行
复制
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上文档化的VisualState/VisualStateGroups显然在代码中缺失?我是做错了什么(我的怀疑),还是MSDN不正确?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-25 00:21:04

你问题答案的第一部分是在MSDN VisualStateManager.GetVisualStateGroups注释中。

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

所以

代码语言:javascript
运行
复制
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,如

代码语言:javascript
运行
复制
<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中,VisualState是为PasswordBox自动定义的。在WPF中,您必须自己定义它们。Expression给您提供了IDE的States选项卡中的状态,并且当您记录更改时,它将自动生成与Storyboard一起的代码,但如果没有编辑Storyboard的状态,则不会有帮助。

如前所述猜测这仅仅是因为默认样式在WPF中不使用VSM开箱即用。

下载链接到一个示例,其中“我们”显式地定义了一个PasswordBox的VSM和VisualState,我之前发布的两个函数都是工作的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17286792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档