2013-05-16 17 views
5

Le estensioni reattive mi consentono di "osservare" un flusso di eventi. Ad esempio, quando l'utente digita la query di ricerca nel riquadro di ricerca di Windows 8, SuggestionsRequested viene sollevato più e più volte (per ogni lettera). Come posso sfruttare le estensioni reattive per limitare le richieste?Come posso utilizzare le estensioni reattive per limitare SearchPane.SuggestionsRequested?

Qualcosa di simile a questo:

SearchPane.GetForCurrentView().SuggestionsRequested += (s, e) => 
{ 
    if (e.QueryText.Length < 3) 
     return; 
    // TODO: if identical to the last request, return; 
    // TODO: if asked less than 500ms ago, return; 
}; 

Soluzione

System.Reactive.Linq.Observable.FromEventPattern<Windows.ApplicationModel.Search.SearchPaneSuggestionsRequestedEventArgs> 
    (Windows.ApplicationModel.Search.SearchPane.GetForCurrentView(), "SuggestionsRequested") 
    .Throttle(TimeSpan.FromMilliseconds(500), System.Reactive.Concurrency.Scheduler.CurrentThread) 
    .Where(x => x.EventArgs.QueryText.Length > 3) 
    .DistinctUntilChanged(x => x.EventArgs.QueryText.Trim()) 
    .Subscribe(x => HandleSuggestions(x.EventArgs)); 

Installare RX per WinRT: http://nuget.org/packages/Rx-WinRT/ saperne di più: http://blogs.msdn.com/b/rxteam/archive/2012/08/15/reactive-extensions-v2-0-has-arrived.aspx

risposta

4

ci sono Throttle e DistinctUntilChanged metodi.

System.Reactive.Linq.Observable.FromEventPattern<Windows.ApplicationModel.Search.SearchPaneSuggestionsRequestedEventArgs> 
    (Windows.ApplicationModel.Search.SearchPane.GetForCurrentView(), "SuggestionsRequested") 
    .Throttle(TimeSpan.FromMilliseconds(500), System.Reactive.Concurrency.Scheduler.CurrentThread) 
    .Where(x => x.EventArgs.QueryText.Length > 3) 
    .DistinctUntilChanged(x => x.EventArgs.QueryText.Trim()) 
    .Subscribe(x => HandleSuggestions(x.EventArgs)); 

Si potrebbe desiderare/necessità di utilizzare un sovraccarico diverso per DistinctUntilChanged, per esempio utilizzando diversi di confronto di uguaglianza o la Func<TSource, TKey> di sovraccarico:

.DistinctUntilChanged(e => e.QueryText.Trim()) 

che farà quello che vuoi.

+0

@ JerryNixon-MSFT Oh, mi dispiace per quello :) È spuntato quando stavo navigando ... Sono contento che avevo ragione però. –