C# 如何使用VisualStateManager刷新当前状态

C# 如何使用VisualStateManager刷新当前状态,c#,.net,silverlight,C#,.net,Silverlight,我有一个Silverlight 4应用程序,其中我在XAML中定义了一些状态,并使用VisualStateManager.GoToState(这个“stateName”,false),它可以正常工作 然而,问题是一些状态属性绑定到UI,因此用户可以自定义诸如颜色之类的内容。当处于该状态时(假设状态A),可以执行此操作。直到我更改到另一个状态,然后返回到状态A,这些更改才会反映出来。问题不在于从UI到基础属性的绑定(它们具有预期的值),而是需要刷新状态——或者至少我的结论是这样 起初我只是尝试了V

我有一个Silverlight 4应用程序,其中我在XAML中定义了一些状态,并使用
VisualStateManager.GoToState(这个“stateName”,false)
,它可以正常工作

然而,问题是一些状态属性绑定到UI,因此用户可以自定义诸如颜色之类的内容。当处于该状态时(假设状态A),可以执行此操作。直到我更改到另一个状态,然后返回到状态A,这些更改才会反映出来。问题不在于从UI到基础属性的绑定(它们具有预期的值),而是需要刷新状态——或者至少我的结论是这样

起初我只是尝试了
VisualStateManager.GoToState(这是“StateA”,false)
,但发现了这一点

然后我尝试了,但没有成功,尽管这确实不是一个好的解决方案:

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();
}
此代码应适用于:

VisualStateManager.GoToState(this, "StateB", false);
VisualStateManager.GoToState(this, "StateA", false);
这是强制刷新的典型Silverlight/WPF方法。虽然这看起来有些骇客,但我在Microsoft和Silverlight工具包代码中看到过完全相同的方法

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

你需要做两件事:

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

  • 确保在dependency属性的属性更改处理程序中调用状态更改

  • 为供参考,请按如下方式注册PropertyChanged处理程序:

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

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