Регулирование события из элемента управления в Silverlight - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть приложение Silverlight, которое использует элемент управления Bing Maps.Данные загружаются, когда вид карт перестает меняться.Я видел пример , где кто-то использовал версию элемента управления ASP.Net и смог это сделать.Возможно ли то же самое в Silverlight?

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

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

rx (если я не позади) еще не встроен в silverlight и кажется немного излишним, чтобы клиент загружал все rx dll только для регулирования, если вы не собираетесь его широко использовать.

В самом простом видесоздайте свой собственный класс регулирования, используя dispatchtimer, который принимает начальный вызов, ждет x секунд и затем проверяет, поступил ли еще один вызов с тех пор, прежде чем выполнить ваше действие.

Извините, у меня нет кода на руках

1 голос
/ 28 августа 2012

Чтобы обойти ошибку 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.

1 голос
/ 01 февраля 2012

Вы можете сделать это с 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)
{
    ...
}

(непроверенные)

...