如何使用VisualStateManager刷新当前状态

时间:2012-07-30 11:57:24

标签: c# .net silverlight

我有一个Silverlight 4应用程序,其中我在XAML中定义了一些状态,并使用VisualStateManager.GoToState(this, "stateName", false)按预期工作。

然而问题是某些州的属性绑定到UI,因此用户可以自定义颜色等内容。当处于该状态时(可以说是状态A),可以这样做。直到我改变到另一个状态,然后回到状态A时,更改才会反映出来。问题不是从UI到底层属性的绑定(它们具有预期值),而是需要刷新状态 - 或者至少这是我的结论。

刚开始我只是尝试了VisualStateManager.GoToState(this, "StateA", false),但发现了"if the control is already in the stateName state, GoToState takes no action returns true"

然后我尝试了没有成功,虽然它确实不是一个很好的解决方案:

VisualStateManager.GoToState(this, "StateB", false);
VisualStateManager.GoToState(this, "StateA", false);

有谁知道我如何强制刷新或解决方法?

更新 我设法使用以下答案的组合并在依赖项属性更改时使用以下代码。 Storyboard.Stop()Storyboard.Begin()似乎考虑了从UI设置的属性的新值。

if (VisualStateManager.GoToState(this, "StateA", false))
{
    VisualState stateA = (VisualState)VisualStateGroup.States[0];
    stateA.Storyboard.Stop();
    stateA.Storyboard.Begin();
}

2 个答案:

答案 0 :(得分:5)

此代码应该有效:

VisualStateManager.GoToState(this, "StateB", false);
VisualStateManager.GoToState(this, "StateA", false);

这是强制刷新的典型Silverlight / WPF方式。虽然它看起来很hacky,但我在Microsoft和Silverlight工具包代码中看到了这种完全相同的方法。

现在,我的猜测是控件尚未加载,或者您在属性更改时没有调用状态更改。

你需要做两件事:

  1. 在OnApplyTemplate或控件的加载事件中,将控件置于正确的状态。在控件实际完成加载模板之前,通常会更新DependencyProperties。在这种情况下,即使你调用GoToState,也没有模板,所以它不会做任何事情,因为没有模板。

  2. 确保在依赖项属性的Property Change处理程序中,您正在调用状态更改。

  3. 供您参考,您可以注册一个PropertyChanged处理程序:

     public static readonly DependencyProperty MinValueProperty =
            DependencyProperty.Register("MinValue", typeof(double), typeof(ScaleValueConverter), new PropertyMetadata(0.0d,OnMinValuePropertyChanged));
    

答案 1 :(得分:1)

在UWP XAML中,只需命名为VisualStateGroup:

<VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="PopupStates">
                <VisualState x:Name="Mobile">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="0"/>
                    </VisualState.StateTriggers>

并刷新状态:

VisualStateManager.GoToState(this, PopupStates.CurrentState.Name, false);