在Silverlight中限制控件中的事件
本文关键字:事件 控件 Silverlight | 更新日期: 2023-09-27 18:21:59
我有一个Silverlight应用程序,它利用了Bing Maps控件。当地图视图停止更改时加载数据。我看到一个例子,有人使用了控件的ASP.Net版本,并能够实现这一点。同样的事情在Silverlight中可能发生吗?
Microsoft.Maps.Events.addThrottledHandler(map, 'viewchangeend', UpdatePOIData, 250);
rx(除非Im落后)还没有内置到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
的引用。