我已经将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()
时。经过进一步调查,当在它们上调用
NameScope.GetNameScope()
时,VisualStateManager,视觉状态和情节提要板都返回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方面为何会有不同的行为?
谢谢
最佳答案
检索控件模板中的命名元素,然后调用storyboard.Begin(_retrievedElement)
而不是storyboard.Begin()
来解决“没有适用的名称范围”问题。在这种情况下,传递的框架元素的名称范围将应用于情节提要。有关此方法的不同重载的更多信息,请参见http://msdn.microsoft.com/en-us/library/system.windows.media.animation.storyboard.begin.aspx。
不幸的是,我无法解释为什么Visual States Manager无法为您提供控制。
更新:我可能已经弄清楚了为什么您的控件模板可以在Silverlight中工作,而不能在WPF中工作。下一个答案中的详细信息。
关于c# - 无法过渡到VisualState-“没有适用的名称范围”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14231518/