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

Другие вопросы по тегам