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

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

更新: 当依赖属性发生变化时,我设法让它结合下面的答案和使用下面的代码工作。并且似乎考虑了从 UI 设置的属性的新值Storyboard.Stop()Storyboard.Begin()

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

2 回答 2

5

此代码应该可以工作:

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

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

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

你需要做两件事:

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

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

供您参考,您注册一个 PropertyChanged 处理程序,如下所示:

 public static readonly DependencyProperty MinValueProperty =
        DependencyProperty.Register("MinValue", typeof(double), typeof(ScaleValueConverter), new PropertyMetadata(0.0d,OnMinValuePropertyChanged));
于 2012-07-30T20:32:27.227 回答
1

在 UWP XAML 中,只需将 de 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);
于 2015-11-02T15:07:15.790 回答