MapControl Template10
РЕШИТЬ
Я решил эту проблему с тем, что мне нужно добавить MapItemsControl.ItemTemplate. Без этого он не отображает ничего, кроме имени элемента управления.
Так что просто добавьте этот код:
<Maps:MapItemsControl x:Name="mainMapItems" ItemsSource="{Binding MapItems}">
<Maps:MapItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Background="Transparent">
<TextBlock Maps:MapControl.Location="{Binding Location}" Text="{Binding Title}" Maps:MapControl.NormalizedAnchorPoint="0.5,0.5" FontSize="20" Margin="5"/>
</StackPanel>
</DataTemplate>
</Maps:MapItemsControl.ItemTemplate>
</Maps:MapItemsControl>
Это не идеально, потому что это не даст вам значок на карте, а просто текст. Но это легко решить, добавив Image = "" в коллекцию.
Я пытаюсь использовать MapControl в макете Template10.
Код, который я использую
MainPage.xaml
<Maps:MapControl x:Name="MapControl1"
ZoomInteractionMode="GestureAndControl"
TiltInteractionMode="GestureAndControl"
MapServiceToken="<ApiCodeHere>"
Loaded="{x:Bind ViewModel.Map_Loaded}"/>
MainPageViewModel.cs
MapControl _Map;
public MapControl Map { get { return _Map; } set { Set(ref _Map, value); RaisePropertyChanged(); } }
public async void Map_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
MapControl newMap = new MapControl();
Geoposition userLocation = await GetUserLocation();
BasicGeoposition GeoPos_UserLocation = new BasicGeoposition() { Latitude = userLocation.Coordinate.Point.Position.Latitude, Longitude = userLocation.Coordinate.Point.Position.Longitude };
BasicGeoposition GeoPos_NorthWest = new BasicGeoposition() { Latitude = userLocation.Coordinate.Point.Position.Latitude + 0.05, Longitude = userLocation.Coordinate.Point.Position.Latitude + 0.1 };
BasicGeoposition GeoPos_SouthEast = new BasicGeoposition() { Latitude = userLocation.Coordinate.Point.Position.Latitude - 0.05, Longitude = userLocation.Coordinate.Point.Position.Latitude - 0.1 };
GeoboundingBox mapBox = new GeoboundingBox(GeoPos_NorthWest, GeoPos_SouthEast);
// Add Point for User
MapIcon Icon_UserLocation = new MapIcon() { Location = new Geopoint(GeoPos_UserLocation) };
newMap.MapElements.Add(Icon_UserLocation);
newMap.Center = new Geopoint(mapBox.Center);
Map = newMap;
await Task.CompletedTask;
}
Функция Map_Loaded запускается как исключено. У меня проблема с тем, что если бы это был обычный проект, я бы установил данные непосредственно в MapControl1.Center и MapControl1.MapElements.Add. Но так как это проект MVVM, это не то, как это делается, и я немного запутался, как действовать дальше.
Я хотел бы сделать что-то вроде Views.MainPage.MapControl1.Center = new Geopoint(), но это явно не работает.
Дополнительное обновление
Оказывается, это было так просто, как я думал. Это был просто вопрос мышления в правильном порядке.
MapControl имеет элементы управления для масштабирования и центра, и тому подобное. Так что для кода MVVM это работает
Center="{Binding MapCenter,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Zoom="{Binding MapZoom,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
У меня, однако, были проблемы с настройкой MapItems, как описано в документе, к которому я обращаюсь.
Чтобы получить элементы на карте, вам нужно добавить MapItemsControl, и он должен работать примерно так...
<Maps:MapItemsControl x:Name="mainMapItems" ItemsSource="{Binding MapItems,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></Maps:MapItemsControl>
Но мой код в MainPageViewModel.xaml не работает с этим. Элементы не обновляются.
IList<MapElement> _MapItems;
public IList<MapElement> MapItems { get { return _MapItems; } set { Set(ref _MapItems, value); RaisePropertyChanged(); } }
IList<MapElement> MapItems = new List<MapElement>() {
new MapIcon() {
Location = new Geopoint(GeoPos_UserLocation),
Title = "You Are Here!"
}
};
Источники: Windows 10 SDK Bing Maps Control
2 ответа
Я решил эту проблему с тем, что мне нужно добавить MapItemsControl.ItemTemplate. Без этого он не отображает ничего, кроме имени элемента управления.
Так что просто добавьте этот код:
<Maps:MapItemsControl x:Name="mainMapItems" ItemsSource="{Binding MapItems}">
<Maps:MapItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Background="Transparent">
<TextBlock Maps:MapControl.Location="{Binding Location}" Text="{Binding Title}" Maps:MapControl.NormalizedAnchorPoint="0.5,0.5" FontSize="20" Margin="5"/>
</StackPanel>
</DataTemplate>
</Maps:MapItemsControl.ItemTemplate>
</Maps:MapItemsControl>
Это не идеально, потому что это не даст вам значок на карте, а просто текст. Но это легко решить, добавив Image = "" в коллекцию.
Попробуйте использовать
ObservableCollection ObserverableCollection<MapElement> MapItems =
new ObservableCollection<MapElement>();
Так как вы ожидаете, что элемент будет "обновляемым во время выполнения" или будет реагировать на изменения, ObservableCollection скрытно реализует INPC