1

私はC#、Silverlight、WP7を使用しています。

LayoutUpdatedイベントの各シリーズの最後にオーバーレイするオーバーレイ(これと同様)アプリに追加しようとしています。

最初の問題は、LayoutUpdatedが、アプリのロード、スクロール、ピボットのいずれであっても、各コントロールイベントで複数回起動されることです。最後のLayoutUpdatedイベントの後にコードを実行する必要があります。この質問によると、LoadedイベントでBeginInvokeを実行すると、コードはすべてのイベントの発生が終了するのを待つことができます。これについての私の理解は正しいですか?

もう1つの問題は、LayoutUpdatedイベントでのレイアウトの更新です。この質問は、LayoutUpdatedイベントの発生が無限ループになること、および解決策はhasChangedフラグを設定することであると述べています。しかし、次の制御イベントでフラグをリセットする必要がありますよね?

これらの両方の質問を解決するソリューションを実装する方法がわかりません。
前もって感謝します。

4

1 に答える 1

1

私は1つの解決策で両方の問題を解決することになりました。このメソッドが最後に呼び出された時刻を追跡するために変数を追加しました。しきい値(たとえば500ms)内で呼び出されなかった場合は、ディスパッチャーにメソッドを追加します。

これにより、LayoutUpdatedイベントが1回呼び出されるか複数回呼び出されるかに関係なく、メソッドは1回実行されます。最初の呼び出しでも実行されるように、変数を時間の先頭に初期化します。

これが私のコードです:

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 に答える