2010-09-24 3 views
3

Я хотел бы реализовать специальный слайдер масштабирования для элемента управления Bing Maps в приложении Silverlight. Я могу установить механику его в довольно простым способом:Как связать максимальный и минимальный уровни масштабирования в Bing Maps Silverlight

<Slider ... Value="{Binding ZoomLevel, Mode=TwoWay, ElementName=MyMap}"/> 

Однако, я не могу найти способ связать максимальные и минимальные свойства ползунка максимальной и минимальной доступной zoomlevel на карте , Я использую представления по умолчанию (Road, Aerial), а не пользовательские плитки или что-то необычное.

Я пытался что-то вроде этого:

Maximum="{Binding Path=Map.Mode.ZoomRange.To, Mode=TwoWay}" 
Minimum="{Binding Path=Map.Mode.ZoomRange.From, Mode=TwoWay}" 

Но это не работает. Когда моя карта загружается, минимальное значение устанавливается на 0.0, а значение Maximum равно 1.0. Фактические значения Map.Mode.ZoomRange равны 1.0 и 17.0 (для конкретного местоположения, на которое я смотрю сейчас. Max изменяется в зависимости от того, где расположена карта).

Как связать эти свойства с новым пользовательским слайдером?

ответ

0

Вы не сможете так привязываться, потому что Mode не является свойством зависимостей и не является MapMode зависимым объектом. Ни одно из других свойств в цепочке не реализуется и не реализует INotifyPropertyChanged. Так что связывание их в значительной степени обречено.

Вам понадобится код. Возможно, событие карты ModeChanged срабатывает при изменении диапазона, и в этом случае вы можете обновить Min/Max в точке.

Неспособность использовать один из видов изменившихся событий, таких как TargetViewChanged или ViewChangeEnd.

+0

Спасибо. Я в конечном итоге собрал обработчик TargetViewChanged раньше, как полоса, но я думаю, это будет мое постоянное решение. Наихудший сценарий заключается в том, что слайдер не обновляется так быстро или точно, как в противном случае, и я могу завершить масштабирование конца полосы прокрутки. Это не так уж плохо. – Whiteknight

0

Как указано в другом месте, вы не можете сделать это посредством привязки, по крайней мере, не используя текущий API.

Следующий код сделает трюк. Выполните его сразу после вашего заявления InitializeComponent();.

Action updateSliderRange =() => 
    { 
     _slider.Minimum = _map.Mode.ZoomRange.From; 
     _slider.Maximum = _map.Mode.ZoomRange.To; 
    }; 
_map.ModeChanged += delegate { updateSliderRange(); }; 
_map.TargetViewChanged += delegate { updateSliderRange(); }; 
updateSliderRange();