WP7控件:何时从Tombstone恢复后设置VisualState?

时间:2012-03-22 14:45:08

标签: windows-phone-7 visualstatemanager tombstoning

我的问题很简单:WHEN (在什么事件上?)我可以确定控件已完全加载并且还有其状态和模板吗?


我为什么要问:

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

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

从逻辑删除中恢复后,我尝试通过将Rectangles设置为“已选择”(适用于任何其他方案)来选择VisualState。我发现它失败了,因为VisualStateManager无法找到"Selected"状态。

我知道这很棘手,因为当从墓碑回来时,控件不会像任何“正常”情况那样完全构建。 (例如BindingsTemplates不适用于相同的顺序)但到目前为止,我始终可以相信,当FrameworkElement.Loaded被解雇时,我已准备好控件。现在似乎VisualState不是。 (我尝试从Loaded事件处理程序设置状态,但结果相同,VisualStateManager.GoToState返回false。)

我还能做些什么?

1 个答案:

答案 0 :(得分: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;
  }