5

XAML でいくつかの状態が定義されている Silverlight 4 アプリケーションがあり、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();
}
4

2 に答える 2

5

このコードは動作するはずです:

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

これは、更新を強制する典型的な Silverlight/WPF の方法です。ハックのように思えますが、Microsoft と Silverlight ツールキットのコードでまったく同じアプローチを見てきました。

さて、私の推測では、コントロールがまだロードされていないか、プロパティが変更されたときに状態の変更を呼び出していないということです。

次の 2 つのことを行う必要があります。

  1. OnApplyTemplate またはコントロールのロード イベントで、コントロールを適切な状態にします。DependencyProperties は、コントロールが実際にテンプレートの読み込みを完了する前に更新されることがよくあります。このシナリオでは、GoToState を呼び出しても、テンプレートがないため何も実行されません。

  2. 依存関係プロパティの Property Change ハンドラーで、状態の変更を呼び出していることを確認してください。

参考までに、次のように 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 に答える