在Silverlight中限制控件中的事件

本文关键字:事件 控件 Silverlight | 更新日期: 2023-09-27 18:21:59

我有一个Silverlight应用程序,它利用了Bing Maps控件。当地图视图停止更改时加载数据。我看到一个例子,有人使用了控件的ASP.Net版本,并能够实现这一点。同样的事情在Silverlight中可能发生吗?

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

在Silverlight中限制控件中的事件

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.CoreSystem.Reactive.InterfacesSystem.Reactive.LinqSystem.Reactive.Windows.Threading的引用。