【问题标题】:LayoutUpdated event needs to update the layout...infinite loopLayoutUpdated 事件需要更新布局...无限循环
【发布时间】:2012-09-12 21:16:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# silverlight event-handling begininvoke


    【解决方案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();
                    });
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多