0

私のシナリオ。私の WP8 Silverlight アプリのページには、アイテムの複数選択機能を持つ ListBox コントロールが含まれています。ユーザーがアイテムをタップして選択状態を切り替えると、その時点で選択されているすべてのアイテムに対して長い操作を実行する必要があります (たとえば、現在選択されているアイテムでフィルター処理するクエリを実行します)。ユーザーはいくつかの項目を非常にすばやくタップでき、タップするたびにクエリを実行する必要はありません (特に、クエリに 1 ~ 2 秒かかる可能性があるという事実を考慮すると)。ユーザーが 1 ~ 2 秒間何も言わない場合は、クエリを実行する必要があります。

リソースを消費しない、WP8 で実装する最良の方法は何ですか? おそらく、プラットフォームはそのための便利なサービスを提供してくれるでしょうか?

4

3 に答える 3

1

あなたのケースはReactive Extensionsの良い候補のようです

次の例では、ListBox selection changed イベントのオブザーバーを使用し、観察が報告されるまで 1.5 秒間待機します。

var itemsChanged = (from evt in Observable.FromEventPattern<SelectionChangedEventArgs>(MyList, "SelectionChanged")
                    select MyList.SelectedItems)
                   .Throttle(TimeSpan.FromSeconds(1.5));

itemsChanged.ObserveOnDispatcher()
            .Subscribe(items =>
                {
                    Debug.WriteLine("----------------");
                    foreach (var item in items)
                    {
                        Debug.WriteLine(item);
                    }
                }
        );
于 2014-06-02T15:07:05.413 に答える
0

これがあなたのシナリオの1つの解決策です。私の解決策を伝えるための単なる擬似コードであることに注意してください

private bool isLoadingData = false;
private bool newQueryQueued = false;

///code in your itemselectionchanged event handler
if(isLoadingData)
{
    newQueryQueued = true;
    //Do not execute your query.

}
else
{
    //Execute your query and get the result.
    //after the query result is completed, execute the following code.
    isLoadingData = false;
    if(newQueryQueued)
    {
        isLoadingData = true;
        newQueryQueued = false;
        //Execute your query and get the result.
    }
}

上記の疑似コードでは、クエリは必要な場合にのみ実行されます。最初の実行中に使用が 4 アイテムをタップした場合を言います。前の結果がまだ保留中のため、リソース クエリは実行されません。結果が受信されると、コードはユーザーが選択を変更したかどうかを確認し、選択が変更された場合はクエリを再度実行します。

そして第二部へ

ユーザーが 1 ~ 2 秒間何も言わない場合は、クエリを実行する必要があります。

ページの読み込み時に任意の時間 (1 秒または 2 秒) のタイマーを実装し、最初の時間が経過した後にタイマーを破棄する必要があります。

お役に立てれば

于 2014-06-02T13:15:07.743 に答える