Esri Silverlight управляет панорамированием/масштабированием из кода

У меня проблемы с корректным поведением карты при вызове ZoomToResolution и PanTo. Мне нужно иметь возможность масштабировать карту с определенными координатами и центром.

Единственный способ, которым я заработал, - это удалить анимацию:

this.MapControl.ZoomDuration = new TimeSpan(0);
this.MapControl.PanDuration = new TimeSpan(0);

В противном случае, если я сделаю вызов следующим образом:

control.MapControl.ZoomToResolution(ZoomLevel);
control.MapControl.PanTo(MapPoint());

Он делает одно или другое (например, панорамирование или масштабирование, но не то и другое). Если (после анимации) я вызываю этот код второй раз (карта уже увеличена или панорамирована до нужного положения/уровня) - он выполняет вторую часть.

Пробовал это:

control.MapControl.ZoomToResolution(ZoomLevel, MapPoint());

Та же проблема, внутри он вызывает вышеуказанные команды

Итак, мой единственный обходной путь прямо сейчас — установить продолжительность масштабирования/панорамирования на 0. И это ухудшает UX при использовании мыши.

Я также пробовал что-то вроде этого:

this.MapControl.ZoomDuration = new TimeSpan(0);
this.MapControl.PanDuration = new TimeSpan(0);
control.MapControl.ZoomToResolution(ZoomLevel);
control.MapControl.PanTo(MapPoint());
this.MapControl.ZoomDuration = new TimeSpan(750);
this.MapControl.PanDuration = new TimeSpan(750);

Кажется, что это работает, но тогда взаимодействие с мышью становится «сумасшедшим». Прокрутка мыши заставит карту прыгать и приближаться к случайным местам.

Есть ли известное решение?


person katit    schedule 20.10.2014    source источник


Ответы (1)


Проблема в том, что вторая операция заменяет предыдущую. Вам придется дождаться завершения одного, прежде чем начинать следующий. Но это, вероятно, не дает желаемого эффекта. Вместо этого увеличьте масштаб, и вы получите желаемое поведение. Если у вас нет экстента, а есть только центр и разрешение, вы можете создать его, используя следующее:

var zoomToExtent = new Envelope(point.X - разрешение * MapControl.ActualWidth/2, point.Y, point.X + разрешение * MapControl.ActualWidth/2, point.Y);

Кстати, в вашем коде немного сбивает с толку то, что вы называете свое разрешение «ZoomLevel». Я предполагаю, что это разрешение карты, а не номер уровня, верно? Элемент управления картой esri не работает с уровнями, специфичными для службы, но не зависит от уровней данных и использует более общее значение разрешения «единицы на пиксель».

person dotMorten    schedule 21.10.2014
comment
ZoomLevel — это просто выбранное мной число, которое выглядит правильно. Так что да, это не номер уровня... Я попробую zoomToExtent. Есть ли что-то вроде асинхронных операций с управлением esri? Я не возражаю против цепочек вызовов, если это необходимо, но каков синтаксис? Определенно не хочу блокировать поток пользовательского интерфейса. Я конвертирую из элемента управления Bing Maps, поэтому это может выглядеть запутанно, пытаясь сохранить код как можно ближе. Я уже создал свой собственный элемент управления, который обертывает карту esri, и смог сделать почти все, что мне нужно, дружественным к MVVM. - person katit; 21.10.2014
comment
Это работает, но анимации нет. Есть ли способ сделать так, чтобы она красиво анимировалась, как карты Bing? Так, например, если я нахожусь в определенной точке/масштабе и мне нужно перейти в другую точку - было бы неплохо, если бы карта уменьшалась при панорамировании, а затем приближалась к новой точке. Это улучшит использование UX, потому что покажет, где находится новое местоположение. - person katit; 21.10.2014
comment
Должна быть анимация. Вы сохранили продолжительность масштабирования на 0 (если да, избавьтесь от него). Однако обратите внимание, что если экстент, который вы собираетесь пройти, находится очень далеко, анимация будет пропущена, чтобы избежать панорамирования и загрузки тайлов по всему миру. Поддержки асинхронности нет, но вы можете создать ее поверх события (событие Google для асинхронности). Тем не менее, новый esri .net API имеет это. - person dotMorten; 25.10.2014