2013-05-16 11 views
5

Reaktive Erweiterungen erlauben mir, einen Strom von Ereignissen zu "beobachten". Wenn der Benutzer beispielsweise seine Suchabfrage im Windows 8-Suchbereich eingibt, wird SuggestionsRequested immer wieder (für jeden Buchstaben) ausgelöst. Wie kann ich Reaktive Erweiterungen nutzen, um die Anfragen zu drosseln?Wie kann ich Reaktive Erweiterungen verwenden, um SearchPane.SuggestionsRequested zu drosseln?

Etwas wie folgt aus:

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; 
}; 

Lösung

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)); 

Installieren RX für WinRT: http://nuget.org/packages/Rx-WinRT/ Weitere Informationen: http://blogs.msdn.com/b/rxteam/archive/2012/08/15/reactive-extensions-v2-0-has-arrived.aspx

Antwort

4

Es gibt Throttle und DistinctUntilChanged Methoden.

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)); 

Sie können/wollen, müssen für DistinctUntilChanged unterschiedliche Überlastung verwenden, z.B. mit unterschiedlichem Gleichheitsvergleich oder die Func<TSource, TKey> Überlastung:

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

Das wird tun, was Sie wollen.

+0

@ JerryNixon-MSFT Oh, Entschuldigung für das :) Es tauchte auf, als ich stöberte ... Froh, dass ich recht hatte. –