我已将 silverlight TemplatedControl 移植到 WPF,虽然它的行为基本相同,但动画不再起作用。
当我调用VisualStateManager.GoToState()
它时返回false。为了手动强制执行此操作,我遵循了其他人的建议并按名称查找了视觉状态组,并强制情节提要运行:
foreach (VisualStateGroup vsg in VisualStateManager.GetVisualStateGroups(part_LayoutRoot))
{
VisualState vs = vsg.States.Cast<VisualState>().FirstOrDefault(o => o.Name == visualState);
if (vs == null)
throw new ApplicationException("No visual state found with name: " + visualState);
vs.Storyboard.Begin();
break;
}
但是,No applicable name scope exists to resolve the name 'PART_MyPart'
当我调用Storyboard.Begin()
.
经过进一步调查,VisualStateManager、视觉状态和情节提要在NameScope.GetNameScope()
调用它们时都返回 null,因此我也尝试在代码中手动设置它们:
var nameScope = NameScope.GetNameScope(vs.Storyboard);
if (nameScope == null)
{
nameScope = NameScope.GetNameScope(part_LayoutRoot);
NameScope.SetNameScope(vsg, nameScope);
NameScope.SetNameScope(vs, nameScope);
NameScope.SetNameScope(vs.Storyboard, nameScope);
}
但是,异常继续被提出,我无法终生思考为什么。这在 Silverlight 中完全符合预期。
任何人都可以解释为什么silverlight和WPF在NameScope方面会有不同的行为吗?
谢谢