2012-03-22 89 views
3

我的問題很簡單:什麼時候(什麼事件?)我可以確定一個控件已完全加載並且其狀態和模板也是?


WP7控件:從墓碑恢復後何時設置VisualState?

爲什麼我問:

我試圖從墓碑恢復後恢復我自己的WP7控制的狀態。這個控件在周視圖中看起來像一個日曆。在此日曆中,您可以選擇許多顯示爲彩色矩形的項目。

如果我選擇它們中的任何一個,然後進入墓碑並返回頁面,似乎我的控件忘記了哪個Rectangles被選中。事實上,它並沒有忘記數據本身,但Rectangles忘記了他們的選擇狀態。

從墓碑中恢復後,我嘗試通過將其VisualState設置爲「Selected」(可在任何其他場景中使用)來選擇Rectangles。我發現,它失敗了,因爲VisualStateManager找不到"Selected"狀態。

我知道這很棘手,因爲從邏輯刪除回來時,控件並不像任何「正常」情況那樣精確構建。 (例如BindingsTemplates不適用於相同的順序)但直到現在,我總是可以相信,當FrameworkElement.Loaded解僱時,我已經準備好了我的控制。現在好像VisualState不是。 (我試圖設置從Loaded事件處理程序的狀態,但結果相同,VisualStateManager.GoToState返回false。)

我還能做什麼?

回答

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; 
    } 
+0

哈!太感謝了! 自從昨天起,我的控件結構發生了變化,但該方法正常工作! :) 再次感謝! – Tenshiko 2012-03-23 09:41:44