我的问题很简单:WHEN (在什么事件上?)我可以确定控件已完全加载并且还有其状态和模板吗?
我为什么要问:
我正在尝试从逻辑删除恢复后恢复我自己的WP7控件的状态。此控件看起来像每周视图中的日历。在此日历中,您可以选择显示为彩色矩形的许多项目。
如果我选择其中任何一个,然后转到墓碑并返回页面,似乎我的控件忘记了选择了Rectangles
。事实上,它并没有忘记数据本身,但Rectangles
忘记了他们选择的状态。
从逻辑删除中恢复后,我尝试通过将Rectangles
设置为“已选择”(适用于任何其他方案)来选择VisualState
。我发现它失败了,因为VisualStateManager
无法找到"Selected"
状态。
我知道这很棘手,因为当从墓碑回来时,控件不会像任何“正常”情况那样完全构建。 (例如Bindings
和Templates
不适用于相同的顺序)但到目前为止,我始终可以相信,当FrameworkElement.Loaded
被解雇时,我已准备好控件。现在似乎VisualState
不是。 (我尝试从Loaded
事件处理程序设置状态,但结果相同,VisualStateManager.GoToState
返回false
。)
我还能做些什么?
答案 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;
}