我已经将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/

10-09 08:19
查看更多