我正在尝试设置PasswordBox的可视状态,以指示密码不正确时的错误。
根据MSDN文档PasswordBox Syles和模板 (拼写错误他们的),在以下可视状态组中定义了下列可视状态:
然而,以下代码始终返回一个空列表:
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上文档化的VisualState/VisualStateGroups显然在代码中缺失?我是做错了什么(我的怀疑),还是MSDN不正确?
发布于 2013-06-25 00:21:04
你问题答案的第一部分是在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自动定义的。在WPF中,您必须自己定义它们。Expression给您提供了IDE的States选项卡中的状态,并且当您记录更改时,它将自动生成与Storyboard一起的代码,但如果没有编辑Storyboard的状态,则不会有帮助。
如前所述猜测这仅仅是因为默认样式在WPF中不使用VSM开箱即用。
下载链接到一个示例,其中“我们”显式地定义了一个PasswordBox的VSM和VisualState,我之前发布的两个函数都是工作的。
https://stackoverflow.com/questions/17286792
复制相似问题