所以我的xaml代码看起来像这样 –
<Grid x:Name=LayoutRoot> <visualstatemanager.VisualStateGroups> <VisualStateGroup x:Name=CommonStates>
我无法使用GoToVisualState行为,因为我需要在运行此动画之前进行一些检查.所以我想我必须在后面的代码中调用类似GoToState或GotoElementState的东西.
但是,WinRT中似乎不存在Extendedvisualstatemanager.我试过用
visualstatemanager.GetCustomvisualstatemanager(this.LayoutRoot)
但它总是返回null.
这有什么解决方法吗?
刚想通了.
首先创建一个帮助程序类,就像我们以前在Silverlight或Windows Phone中使用它一样(我从here获取了这段代码并对其进行了一些修改,因此当一个元素没有附加任何可视状态组时,它会自动进行搜索其父级,直到找到任何).
public class Extendedvisualstatemanager : visualstatemanager { protected override bool GoToStateCore(Control control,FrameworkElement stateGroupsRoot,string stateName,VisualStateGroup group,VisualState state,bool useTransitions) { if ((group == null) || (state == null)) { return false; } if (control == null) { control = new ContentControl(); } return base.GoToStateCore(control,stateGroupsRoot,stateName,group,state,useTransitions); } public static bool GotoElementState(FrameworkElement element,bool useTransitions) { var root = FindNearestStatefulFrameworkElement(element); var customvisualstatemanager = visualstatemanager.GetCustomvisualstatemanager(root) as Extendedvisualstatemanager; return ((customvisualstatemanager != null) && customvisualstatemanager.GoToStateInternal(root,useTransitions)); } private static FrameworkElement FindNearestStatefulFrameworkElement(FrameworkElement element) { while (element != null && visualstatemanager.GetCustomvisualstatemanager(element) == null) { element = element.Parent as FrameworkElement; } return element; } private bool GoToStateInternal(FrameworkElement stateGroupsRoot,bool useTransitions) { VisualStateGroup group; VisualState state; return (TryGetState(stateGroupsRoot,out group,out state) && this.GoToStateCore(null,useTransitions)); } private static bool TryGetState(FrameworkElement element,out VisualStateGroup group,out VisualState state) { group = null; state = null; foreach (VisualStateGroup group2 in visualstatemanager.GetVisualStateGroups(element)) { foreach (VisualState state2 in group2.States) { if (state2.Name == stateName) { group = group2; state = state2; return true; } } } return false; } }
然后你需要手动将xaml更新为这样的东西 –
<visualstatemanager.Customvisualstatemanager> <common:Extendedvisualstatemanager /> </visualstatemanager.Customvisualstatemanager> <visualstatemanager.VisualStateGroups> <VisualStateGroup .../> </visualstatemanager.VisualStateGroups>
我想这个解决方案的优点是你仍然可以在Blend的States选项卡中看到视觉状态,对于Blend爱好者来说这很酷.
原文地址:https://www.jb51.cc/windows/366387.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。