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 回答