我知道我可以使用VisualStateManager.GoToState以编程方式设置视觉状态。
但是,如果视觉状态是从XAML触发的,如何获取当前的视觉状态?
发布于 2016-02-12 00:54:28
首先,您必须了解一个控件有几个当前的可视状态。但是对于一个视觉状态组存在一个当前视觉状态(并且对于一个控件存在多个视觉状态组)。
对于特定的可视状态组,您可以使用event CurrentStateChanged (或CurrentStateChanging)来捕获可视状态的更改:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="Custom"
CurrentStateChanged="CustomGroup_CurrentStateChanged">
在C#中:
private void CustomGroup_CurrentStateChanged(object sender, VisualStateChangedEventArgs e)
{
Debug.WriteLine(e.NewState.Name);
}
如果不能修改VisualStateGroup的XAML代码,可以使用VisualStateManagner.GetVisualStateGroups方法查询控件的VisualStateGroups集合:
foreach(var group in VisualStateManager.GetVisualStateGroups(aControl))
{
var currentStateName = group.CurrentState.Name;
}
如果您需要检查特定视觉状态组的状态更改,您需要他的名字(例如"CommonStates"),并可以执行以下操作:
var aControl = this;
var visualStateGroupName = "CommonStates";
var myVsg = VisualStateManager.GetVisualStateGroups(aControl).FirstOrDefault(vsg => vsg.Name == visualStateGroupName);
var currentState = myVsg.CurrentState;
myVsg.CurrentStateChanged += (s, e) =>
{
currentState = e.NewState;
};
发布于 2016-02-13 05:57:38
手动处理状态,这不是一个疯狂的想法。下面是操作步骤:
public sealed partial class MainPage : Page
{
public MainPage()
{
InitializeComponent();
MyVisualStateGroup.CurrentStateChanged += (s, e) =>
HandleState(AdaptiveVisualStateGroup.CurrentState);
}
private void HandleState(VisualState currentState)
{
// TODO
}
}
讲得通?
还有一件重要的事情要记住。可以有多个可视状态处于活动状态。当您在问题中询问页面视觉状态是什么时,这是一个加载的问题。单个视觉状态组只能有一个活动的视觉状态。但是一个页面可以有多个视觉状态组。这意味着一个页面可以有多个活动的可视状态。我知道在很多情况下只有一个视觉状态组。但我想让你知道,这个问题本身是棘手的,因为有多个视觉状态组。
祝你好运!
https://stackoverflow.com/questions/35336047
复制相似问题