从Silverlight中的控件限制事件

时间:2012-01-31 21:43:29

标签: c# .net silverlight bing-maps

我有一个使用Bing Maps控件的Silverlight应用程序。地图视图停止更改时加载数据。我看到an example有人使用控件的ASP.Net版本并且能够实现这一点。 Silverlight中同样可能吗?

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

3 个答案:

答案 0 :(得分:2)

除非你要广泛使用它,否则客户端下载所有的rx dll只是为了节流而且还没有内置到silverlight中并且似乎有点过分了。

最简单的方法是使用调度程序创建自己的限制类,该调度程序将初始调用等待x秒,然后检查自执行操作之前是否已进入另一个调用。

抱歉,我手边没有任何代码

答案 1 :(得分: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)
{
    ...
}

(未测试的)

答案 2 :(得分: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.CoreSystem.Reactive.InterfacesSystem.Reactive.LinqSystem.Reactive.Windows.Threading的参考文献。