2012-03-22 7 views
3

私の質問は簡単です:(どのイベントで?)私はコントロールが完全にロードされ、その状態とテンプレートも持っていると確信できますか?
WP7コントロール:Tombstoneから回復した後にVisualStateを設定するのはいつですか?



は、なぜ私が求めています:私は墓石から回復した後、自分のWP7コントロールの状態を復元しようとしている

。このコントロールは、週単位のビューでカレンダーのように見えます。このカレンダーでは、色付きの長方形として表示される多くのアイテムを選択できます。

私がそれらのいずれかを選択してから、墓石に行ってそのページに戻ったら、私のコントロールのなかにはRectanglesが選択されたようです。実際には、データそのものを忘れていませんでしたが、Rectanglesは選択した状態を忘れていました。

墓石から回復した後、VisualStateを「選択済み」に設定することでRectanglesを選択しようとします(他のシナリオでは機能します)。 VisualStateManager"Selected"の状態を見つけることができないので、私はそれが失敗したことを知りました。

墓石から戻ってくると、コントロールはどんな "通常の"場合と同じように正確に構築されないので、これは難しいことです。 (例えば、BindingsTemplatesは同じ順序では適用されません)しかし今まで私は常にFrameworkElement.Loadedが解雇されたときに私のコントロールを準備していたことを常に信じることができました。今はVisualStateのようではありません。 (私はLoadedイベントハンドラから状態を設定しようとしましたが、結果は同じですVisualStateManager.GoToStatefalseと返されます)

これ以上何ができますか?

答えて

1

これはトリッキーなものです! UI自体が完全に構築される前にUIイベントが発生する問題も経験しました。this blog post for an exampleを参照してください。これに対する一般的なアプローチは、LayoutUpdatedイベントを処理することです。このイベントは、ビジュアルツリーが更新されるたびに発生します。このイベントは、Loadedイベントの前後に複数回発生します。

Layoutupdatedイベントが発生すると、視覚的な状態の変化が機能しているかどうかを確認できます。そうでない場合は、試してみてください!ロードされたイベントの中で

、以下を試してみてください。

// try to set the state 
    if (VisualStateManager.GoToState(myControl, "myState") == false) 
    { 
    // if failed, wait for the next LayoutUpdated event 
    EventHandler updateHandler = null; 
    updateHandler = (s, e2) => 
    { 
     if (VisualStateManager.GoToState(myControl, "myState") == false) 
     { 
     myControl.LayoutUpdated -= updateHandler; 
     } 
    }; 
    myControl.LayoutUpdated += updateHandler; 
    } 
+0

ほら!感謝万円! 私のコントロールの構造は昨日から変更されていますが、このメソッドは機能します! :) 再度、感謝します! – Tenshiko

関連する問題