Windows phone 7 WP7控件:从墓碑恢复后何时设置VisualState?

Windows phone 7 WP7控件:从墓碑恢复后何时设置VisualState?,windows-phone-7,visualstatemanager,tombstoning,Windows Phone 7,Visualstatemanager,Tombstoning,我的问题很简单:什么时候(在什么事件上?)我能确保控件已完全加载,并且还有它的状态和模板吗? 我为什么要问: 在从墓碑恢复后,我正在尝试恢复我自己的WP7控件的状态。此控件看起来像每周视图中的日历。在此日历中,您可以选择许多显示为彩色矩形的项目 如果我选择其中任何一个,然后转到tombstone并返回页面,我的控件似乎忘记了选择了哪个矩形。事实上,它没有忘记数据本身,但是矩形忘记了它们的选择状态 从墓碑恢复后,我尝试通过将VisualState设置为“Selected”(在任何其他场景中都

我的问题很简单:什么时候(在什么事件上?)我能确保控件已完全加载,并且还有它的状态和模板吗?


我为什么要问:

在从墓碑恢复后,我正在尝试恢复我自己的WP7控件的状态。此控件看起来像每周视图中的日历。在此日历中,您可以选择许多显示为彩色矩形的项目

如果我选择其中任何一个,然后转到tombstone并返回页面,我的控件似乎忘记了选择了哪个
矩形。事实上,它没有忘记数据本身,但是
矩形
忘记了它们的选择状态

从墓碑恢复后,我尝试通过将
VisualState
设置为“Selected”(在任何其他场景中都有效)来选择
矩形。我发现它失败了,因为
VisualStateManager
找不到
“已选择的”
状态

我知道这很棘手,因为当从墓碑回来时,控件的构建与任何“正常”情况下都不完全一样。(例如,
Bindings
Templates
不按相同的顺序应用)但到目前为止,我始终可以相信,当启动
FrameworkElement.Loaded
时,我已经准备好了控件。现在看来,
VisualState
不是。(我试图从
已加载的
事件处理程序设置状态,但结果相同,
VisualStateManager.GoToState
返回值为
false


我还能做什么呢?

这是个棘手的问题!我还遇到过UI事件在完全构建UI之前触发的问题,请参阅。我的一般方法是处理
LayoutUpdated
事件,该事件在每次更新可视化树时触发。您将发现此事件在加载的
事件之前和之后多次激发

当触发
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;
  }

哈!万分感谢!从昨天起,我的控件的结构发生了变化,但该方法有效:)再次感谢!