我有一個Silverlight應用程序,它利用Bing Maps控件。數據在地圖視圖停止變化時加載。我看到an example有人使用ASP.Net版本的控制,並能夠實現這一目標。在Silverlight中可以做到這一點嗎?從Silverlight中的控件調節事件
Microsoft.Maps.Events.addThrottledHandler(map, 'viewchangeend', UpdatePOIData, 250);
我有一個Silverlight應用程序,它利用Bing Maps控件。數據在地圖視圖停止變化時加載。我看到an example有人使用ASP.Net版本的控制,並能夠實現這一目標。在Silverlight中可以做到這一點嗎?從Silverlight中的控件調節事件
Microsoft.Maps.Events.addThrottledHandler(map, 'viewchangeend', UpdatePOIData, 250);
RX(除非林後面)尚未建成Silverlight和似乎有點矯枉過正,讓客戶端下載所有的RX的dll只是除非你打算廣泛使用它,否則就會受到限制。
最簡單的方法是使用dispatchtimer創建自己的限制類,該類使用初始調用等待x秒,然後在執行操作之前檢查是否有另一個調用進來。
對不起我沒有任何代碼交出
你可以用Reactive Extensions來完成。該Throttle
方法存在這方面的:
var observable =
Observable.FromEventPattern<MapEventArgs>(
handler => map.ViewChangeEnd += handler,
handler => map.ViewChangeEnd -= handler);
observable.Throttle(TimeSpan.FromSeconds(1))
.Subscribe(ev => map_ViewChangeEnd(ev.Sender, ev.EventArgs));
...
void map_ViewChangeEnd(object sender, MapEventArgs e)
{
...
}
(未經測試)
要解決的Invalid cross-thread access (UnauthorizedAccessExcecption) while using Subscribe function
錯誤,你會得到使用此代碼。
使用以下命令:
using System.Reactive.Concurrency;
using System.Reactive.Linq;
var observable = Observable.FromEventPattern<MapEventArgs>(
handler => MyMap.ViewChangeEnd += handler,
handler => MyMap.ViewChangeEnd -= handler);
observable.Throttle(TimeSpan.FromSeconds(2)).ObserveOn(DispatcherScheduler.Current).Subscribe(ev => MyMap_ViewChangeEnd(ev.Sender, ev.EventArgs));
您必須添加ObserveOn(DispatcherScheduler.Current)
,使其工作。並添加System.Reactive.Core
,System.Reactive.Interfaces
,System.Reactive.Linq
和System.Reactive.Windows.Threading
的參考文獻。
看起來有趣;我今天會嘗試。 – 2012-02-01 13:51:17