3

私の質問は単純です:いつ(どのイベントで?)コントロールが完全にロードされ、その状態とテンプレートもあることを確認できますか?


なぜ私は尋ねているのですか:

トゥームストーンから回復した後、自分のWP7コントロールの状態を復元しようとしています。このコントロールは、週単位のビューではカレンダーのように見えます。このカレンダーでは、色付きの長方形として表示される多くのアイテムを選択できます。

それらのいずれかを選択してから、トゥームストーンに移動してページに戻ると、コントロールRectanglesが選択されたものを忘れたようです。実際、データ自体を忘れていませんでしたRectanglesが、選択した状態を忘れていました。

トゥームストーンから回復した後、Rectanglesそれらを「選択済み」に設定して選択しようとしますVisualState(これは他のシナリオで機能します)。VisualStateManager状態がわからないので失敗することがわかりました"Selected"

トゥームストーンから戻ったときにコントロールが「通常の」場合とまったく同じように構築されないため、これは注意が必要です。(たとえばBindingsTemplates同じ順序で適用しないでください)しかし、これまで私は常に信頼FrameworkElement.Loadedできました。解雇されたとき、私は自分のコントロールを準備していたのです。今はそうでVisualStateはないようです。Loaded(イベントハンドラーから状態を設定しようとしましたが、結果は同じで、でVisualStateManager.GoToState返されfalseます。)

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

4

1 に答える 1

1

これはトリッキーなものです!また、UI自体が完全に構築される前にUIイベントが発生するという問題も発生しました。例については、このブログ投稿を参照してください。これに対する私の一般的なアプローチは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;
  }
于 2012-03-23T06:29:28.820 に答える