Windows UAP:获取页面当前的可视状态

use*_*147 2 winrt-xaml win-universal-app windows-10 windows-10-universal

我知道我可以使用VisualStateManager.GoToState以编程方式设置可视状态.

但是,如果从XAML触发视觉状态,如何获得当前视觉状态?

t.o*_*vre 6

首先,您必须了解一个控件有几种当前的可视状态.但是对于一个视觉状态组(以及一个对照的几个视觉状态组)存在一个当前视觉状态.

对于特定的可视状态组,您可以使用事件CurrentStateChanged(或CurrentStateChanging)来捕获可视状态更改:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="Custom"
                      CurrentStateChanged="CustomGroup_CurrentStateChanged">
Run Code Online (Sandbox Code Playgroud)

在C#中:

private void CustomGroup_CurrentStateChanged(object sender, VisualStateChangedEventArgs e)
{
    Debug.WriteLine(e.NewState.Name);
}
Run Code Online (Sandbox Code Playgroud)

如果无法修改VisualStateGroup的XAML代码,则可以使用VisualStateManagner.GetVisualStateGroups方法查询控件的VisualStateGroups集合:

foreach(var group in VisualStateManager.GetVisualStateGroups(aControl))
{
    var currentStateName = group.CurrentState.Name;
}
Run Code Online (Sandbox Code Playgroud)

如果需要检查特定Visual State Group的状态更改,则需要他的名称(例如"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;
};
Run Code Online (Sandbox Code Playgroud)