2012-09-20 64 views
0

我正在使用C#,Silverlight,WP7。LayoutUpdated事件需要更新佈局...無限循環

我想添加一個覆蓋到我的應用程序(類似於this),覆蓋每個LayoutUpdated事件系列的結尾。

第一個問題是LayoutUpdated在每個控件事件上被多次觸發,無論是加載應用程序還是滾動或旋轉。我需要在最後 LayoutUpdated事件後執行我的代碼。根據this問題,在Loaded事件上執行BeginInvoke將允許我的代碼等待所有事件完成觸發。我的理解是正確的嗎?

另一個問題是在LayoutUpdated事件上更新佈局...。 This問題說將會有一個LayoutUpdated事件觸發的無限循環,並且解決方案是設置hasChanged標誌。但國旗需要重新設置,以便在下一次控制事件中,對嗎?

我很困惑如何實現解決這兩個問題的解決方案。
在此先感謝。

回答

1

我最終解決了這兩個問題。我添加了一個變量來跟蹤上次調用此方法的時間,並且如果未在閾值內調用它(例如500毫秒),它會將該方法添加到調度程序中。

這可以確保無論LayoutUpdated事件被調用一次還是多次,該方法都會執行一次。我將變量初始化爲時間的開始,以便即使第一次調用也會執行。

這裏是我的代碼:

public class DesignChecker 
{ 
    private static DateTime lastCallTime = Datetime.MinValue; 
    private static int minTimeSpan = 500; //set this threshold to your own needs 
    public static void designChecker() 
    { 
     DateTime curTime = DateTime.UtcNow; 
     TimeSpan span = curTime - lastCallTime; 
     if (span.TotalMilliseconds < minTimeSpan) 
     { 
      lastCallTime = curTime; 
     } 
     else 
     { 
      lastCallTime = curTime; 
      Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        doDesignCheck(); 
       }); 
     } 
    } 
}