C# LayoutUpdated事件需要更新布局…无限循环

C# LayoutUpdated事件需要更新布局…无限循环,c#,silverlight,event-handling,begininvoke,C#,Silverlight,Event Handling,Begininvoke,我用的是C#,Silverlight,WP7 我正在尝试向我的应用程序添加一个覆盖(类似于),该覆盖在每个LayoutUpdated事件系列的末尾 第一个问题是LayoutUpdate在每个控件事件上都会被触发多次,无论是加载应用程序还是滚动或旋转。我需要在上次LayoutUpdated事件之后执行代码。根据问题,对加载的事件执行BeginInvoke将允许我的代码等待所有事件完成激发。我对这一点的理解正确吗 另一个问题是在LayoutUpdated事件上更新布局。问题是会有一个无限循环的Lay

我用的是C#,Silverlight,WP7

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

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

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

我不知道如何实现解决这两个问题的解决方案

提前感谢。

我最终用一个解决方案解决了这两个问题。我添加了一个变量来跟踪上次调用该方法的时间,如果在阈值内(比如500ms)没有调用该方法,它会将该方法添加到dispatcher

这确保了不管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();
                });
        }
    }
}
公共类设计检查器
{
私有静态DateTime lastCallTime=DateTime.MinValue;
private static int minTimeSpan=500;//将此阈值设置为您自己的需要
公共静态void designChecker()
{
DateTime curTime=DateTime.UtcNow;
TimeSpan=curTime-lastCallTime;
if(span.total毫秒
{
doDesignCheck();
});
}
}
}

我最终用一个解决方案解决了这两个问题。我添加了一个变量来跟踪上次调用该方法的时间,如果在阈值内(比如500ms)没有调用该方法,它会将该方法添加到dispatcher

这确保了不管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();
                });
        }
    }
}
公共类设计检查器
{
私有静态DateTime lastCallTime=DateTime.MinValue;
private static int minTimeSpan=500;//将此阈值设置为您自己的需要
公共静态void designChecker()
{
DateTime curTime=DateTime.UtcNow;
TimeSpan=curTime-lastCallTime;
if(span.total毫秒
{
doDesignCheck();
});
}
}
}