如何使用VisualStateManager刷新当前状态

5
我有一个Silverlight 4应用程序,在其中定义了一些XAML状态,并使用VisualStateManager.GoToState(this,"stateName",false)。它的效果符合预期。

然而,问题在于某些状态的属性绑定到了UI上,因此用户可以自定义诸如颜色之类的内容。在该状态下(假设为状态A),可以进行更改。但是更改不会反映,直到我切换到另一个状态,然后再返回到状态A。问题不在于UI到底层属性的绑定(它们具有预期值),而是需要刷新状态 - 或者至少这是我的结论。

起初,我只是尝试使用VisualStateManager.GoToState(this,"StateA",false),但发现“如果控件已经处于stateName状态,则GoToState不会执行任何操作并返回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个回答

5
这段代码应该有效:
VisualStateManager.GoToState(this, "StateB", false);
VisualStateManager.GoToState(this, "StateA", false);

这是一个典型的Silverlight/WPF强制刷新的方法。虽然看起来很hacky,但我在微软和Silverlight工具包代码中见过完全相同的方法。
现在,我的猜测是控件还没有加载或者当属性改变时你没有调用状态改变。
你需要做两件事:
  1. 在OnApplyTemplate或控件的loaded事件中,将你的控件放到正确的状态中。DependencyProperties经常在控件完成加载模板之前更新。在这种情况下,即使你调用GoToState,也没有模板,所以它不会做任何事情。
  2. 确保在依赖属性的属性更改处理程序中,你正在调用状态更改。
对于你的参考,你可以像这样注册PropertyChanged处理程序:
 public static readonly DependencyProperty MinValueProperty =
        DependencyProperty.Register("MinValue", typeof(double), typeof(ScaleValueConverter), new PropertyMetadata(0.0d,OnMinValuePropertyChanged));

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接