2017-02-17 5 views
2

Я работаю в приложении WPF, используя карту Bing. Одна вещь, которая беспокоит меня, заключается в том, что если вы максимизируете окно и уменьшаете масштаб с помощью колеса мыши, вы можете масштабировать его достаточно далеко до того места, где карта меньше по высоте, чем границы контейнера, в котором он находится. просмотрел документацию, чтобы узнать, есть ли способ ограничить это. Я понимаю, что я могу подписаться на изменения событий увеличения/уменьшения и ограничить ZoomLevel. (См. Прикрепленное изображение, которое показывает проблему, которая у меня есть). Я хочу знать, есть ли какое-либо свойство или другое средство либо в XAML, либо на карте, чтобы всегда гарантировать, что карта может заполнить контейнер независимо от размера окна независимо от уровня масштабирования. Я попытался установить HorizontalAlignment="Stretch" VerticalAlignment="Stretch", но это все еще не решает проблему уменьшения. Любая помощь будет оценена по достоинству.Bing Map Уменьшить Stretch

xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF" 
<m:Map x:Name="MapControl" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        Center="{Binding CenterLocation, 
            Mode=TwoWay, 
            UpdateSourceTrigger=Explicit}" 
        CredentialsProvider="MAP_KEY" 
        ZoomLevel="{Binding ZoomLevel}"> 
       <m:Map.Children> 
        <TextBlock FontSize="20" 
           Foreground="Blue" 
           Text="{Binding ReportText}" /> 
        <m:MapItemsControl ItemTemplate="{StaticResource PinTemplate}" ItemsSource="{Binding WeatherItemSource}" /> 
       </m:Map.Children> 
      </m:Map> 

А вот изображение с серыми краями:

enter image description here

ответ

1

Существует не свойство, чтобы ограничить это, но вы можете легко вычислить, какое увеличить уровень необходимо заполнить карту контейнер. При уровне масштабирования 1 высота карты мира (не путать с контейнером карты) составляет 512 пикселей. Это удваивается с каждым уровнем масштабирования. Уровень масштабирования 2 будет иметь высоту 1024 пикселя и так далее. Уровень 3 будет иметь высоту 2048 пикселей и так далее.

4K экраны имеют вертикальное разрешение около 2000 пикселей. Имея это в виду, вам, скорее всего, нужно будет просто проверить, когда карта загружена и изменена, чтобы определить, какой уровень масштабирования ограничивает карту.

if(mapHeight < 512){ 
    minZoom = 1; 
} else if(mapHeight < 1024){ 
    minZoom = 2; 
} else if(mapHeight < 2048){ 
    minZoom = 3; 
} else{ 
    minZoom = 4; 
} 

Если вы хотите иметь более элегантное решение для вычисления уровня масштабирования для любого возможного размера экрана, вы можете сделать это:

minZoom = Math.Max(Math.Floor(Math.Log(mapHeight/256, 2)) + 1, 1); 
+0

Не должно быть 'Math.log (mapHeight/256, 2) '(т.е. логарифм в базе 2) вместо' Math.Log (mapHeight/256) '? Кроме того, не нужно строго регулировать уровень масштабирования до целочисленного значения, так как свойство 'ZoomLevel' имеет тип' double'. – Clemens

+0

yup. У меня тоже было это в моем тестовом приложении, но он забыл его при вводе в ответ. Должен использовать копирование/вставку. – rbrundritt