1

我正在使用 C#、Silverlight、WP7。

我正在尝试向我的应用程序添加一个覆盖(类似于this),该覆盖覆盖在每个 LayoutUpdated 事件系列的末尾。

第一个问题是 LayoutUpdated 会在每个控件事件上多次触发,无论是加载应用程序还是滚动或旋转。我需要在最后一个LayoutUpdated 事件之后执行我的代码。根据这个问题,对 Loaded 事件执行 BeginInvoke 将允许我的代码等待所有事件完成触发。我对此的理解正确吗?

另一个问题是更新布局......在 LayoutUpdated 事件上。这个问题说会有一个无限循环的 LayoutUpdated 事件触发,解决方案是设置一个 hasChanged 标志。但是标志需要被某些东西重置,以便在下一个控制事件中,对吗?

我很困惑如何实施解决这两个问题的解决方案。
提前致谢。

4

1 回答 1

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();
                });
        }
    }
}
于 2012-09-24T15:06:32.837 回答