Элементы управления WP7: когда устанавливать VisualState после восстановления с Tombstone? - PullRequest
3 голосов
/ 22 марта 2012

Мой вопрос прост: КОГДА (по какому событию?) Я могу быть уверен, что элемент управления полностью загружен и имеет свои состояния и шаблоны?


Почему я спрашиваю:

Я пытаюсь восстановить состояние своего собственного элемента управления WP7 после восстановления из надгробной плиты. Этот элемент управления выглядит как календарь в еженедельном просмотре. В этом календаре вы можете выбрать множество элементов, отображаемых в виде цветных прямоугольников.

Если я выберу любой из них, а затем перейду к надгробной плите и вернусь на страницу, кажется, что мой элемент управления забыл, какие Rectangles были выбраны. Фактически, он НЕ забыл сами данные, но Rectangles забыл свое выбранное состояние.

После восстановления из надгробной плиты я пытаюсь выбрать Rectangles, установив для VisualState значение «Выбрано» (что работает в любом другом сценарии). Я обнаружил, что это не удается, потому что VisualStateManager не может найти состояние "Selected".

Я знаю, что это сложно, потому что когда вы возвращаетесь из надгробной плиты, элементы управления строятся не так, как в любом «нормальном» случае. (например, Bindings и Templates не применяются в одном и том же порядке) Но до сих пор я всегда мог поверить, что когда стрелял FrameworkElement.Loaded, у меня были готовые элементы управления. Теперь кажется, что VisualState нет. (Я пытался установить состояние из Loaded обработчика событий, но результаты те же, VisualStateManager.GoToState возвращается с false.)

Что еще я могу сделать?

1 Ответ

1 голос
/ 23 марта 2012

Это сложно!У меня также возникали проблемы, когда события пользовательского интерфейса запускались до того, как сам пользовательский интерфейс был полностью создан, см. этот пост в блоге для примера .Мой общий подход к этому состоит в обработке события 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;
  }
...