gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:09:28 24 4
gpt4 key购买 nike

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

然而,问题在于某些状态的属性绑定(bind)到 UI,因此用户可以自定义颜色等内容。在该状态下(假设状态 A)可以执行此操作。在我更改为另一个状态,然后返回状态 A 之前,更改不会反射(reflect)出来。问题不在于从 UI 到底层属性的绑定(bind)(它们具有预期值),而是需要刷新状态 - 或者至少这是我的结论。

起初我只是尝试了 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();
}

最佳答案

这段代码应该可以工作:

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

关于c# - 如何使用 VisualStateManager 刷新当前状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11721072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com