如果密码不正确,我试图设置PasswordBox
的可视状态以指示错误。
根据MSDN文档PasswordBox Syles and Templates(其拼写错误),以下可视状态组定义如下:
但是,以下代码始终返回一个空列表:
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不正确?
答案 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中VisualState
是PasswordBox
自动定义的States
。在WPF中,您必须自己定义它们。通过在IDE的Storyboard
选项卡中显示状态,表达式混合稍微有所帮助,当您记录更改时,它会自动为伴随的Template
生成代码,但不是没有您编辑那是VisualState
。
As stated here猜测这只是因为WPF中的默认样式不会使用开箱即用的VSM。
Download link示例“我们”明确定义了VSM,PasswordBox
代表{{1}},其中我之前发布的两个函数都显示正常工作。