2012-01-31 44 views
0

我有一個Silverlight應用程序,它利用Bing Maps控件。數據在地圖視圖停止變化時加載。我看到an example有人使用ASP.Net版本的控制,並能夠實現這一目標。在Silverlight中可以做到這一點嗎?從Silverlight中的控件調節事件

Microsoft.Maps.Events.addThrottledHandler(map, 'viewchangeend', UpdatePOIData, 250); 

回答

2

RX(除非林後面)尚未建成Silverlight和似乎有點矯枉過正,讓客戶端下載所有的RX的dll只是除非你打算廣泛使用它,否則就會受到限制。

最簡單的方法是使用dispatchtimer創建自己的限制類,該類使用初始調用等待x秒,然後在執行操作之前檢查是否有另一個調用進來。

對不起我沒有任何代碼交出

1

你可以用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) 
{ 
    ... 
} 

(未經測試)

+0

看起來有趣;我今天會嘗試。 – 2012-02-01 13:51:17

1

要解決的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.LinqSystem.Reactive.Windows.Threading的參考文獻。