2012-03-22 1 views
3

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


WP7 controls: Когда устанавливать VisualState после восстановления из Tombstone?

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

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

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

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

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

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

ответ

1

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