C# LayoutUpdated事件需要更新布局…无限循环
我用的是C#,Silverlight,WP7 我正在尝试向我的应用程序添加一个覆盖(类似于),该覆盖在每个LayoutUpdated事件系列的末尾 第一个问题是LayoutUpdate在每个控件事件上都会被触发多次,无论是加载应用程序还是滚动或旋转。我需要在上次LayoutUpdated事件之后执行代码。根据问题,对加载的事件执行BeginInvoke将允许我的代码等待所有事件完成激发。我对这一点的理解正确吗 另一个问题是在LayoutUpdated事件上更新布局。问题是会有一个无限循环的LayoutUpdated事件触发,解决方案是设置一个hasChanged标志。但是这个标志需要重置,以便在下一个控制事件中,对吗 我不知道如何实现解决这两个问题的解决方案C# LayoutUpdated事件需要更新布局…无限循环,c#,silverlight,event-handling,begininvoke,C#,Silverlight,Event Handling,Begininvoke,我用的是C#,Silverlight,WP7 我正在尝试向我的应用程序添加一个覆盖(类似于),该覆盖在每个LayoutUpdated事件系列的末尾 第一个问题是LayoutUpdate在每个控件事件上都会被触发多次,无论是加载应用程序还是滚动或旋转。我需要在上次LayoutUpdated事件之后执行代码。根据问题,对加载的事件执行BeginInvoke将允许我的代码等待所有事件完成激发。我对这一点的理解正确吗 另一个问题是在LayoutUpdated事件上更新布局。问题是会有一个无限循环的Lay
提前感谢。我最终用一个解决方案解决了这两个问题。我添加了一个变量来跟踪上次调用该方法的时间,如果在阈值内(比如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();
});
}
}
}