地图控制模板10
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>
它并不完美,因为它不会在地图上为您提供一个图标,而只是一个文本。但是可以通过在 Collection 中添加 Image = "" 轻松解决。
我正在尝试在 Template10 布局中使用 MapControl。
我使用的代码是
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!"
}
};
我解决了这个问题,我必须添加一个 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>
它并不完美,因为它不会在地图上为您提供一个图标,而只是一个文本。但是可以通过在 Collection 中添加 Image = "" 轻松解决。
尝试使用
ObservableCollection ObserverableCollection<MapElement> MapItems =
new ObservableCollection<MapElement>();
由于您期望项目 "updatable at runtime" 或对更改做出反应 ObservableCollection 在幕后实现 INPC
已解决
我解决了这个问题,我必须添加一个 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>
它并不完美,因为它不会在地图上为您提供一个图标,而只是一个文本。但是可以通过在 Collection 中添加 Image = "" 轻松解决。
我正在尝试在 Template10 布局中使用 MapControl。
我使用的代码是
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!"
}
};
我解决了这个问题,我必须添加一个 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>
它并不完美,因为它不会在地图上为您提供一个图标,而只是一个文本。但是可以通过在 Collection 中添加 Image = "" 轻松解决。
尝试使用
ObservableCollection ObserverableCollection<MapElement> MapItems =
new ObservableCollection<MapElement>();
由于您期望项目 "updatable at runtime" 或对更改做出反应 ObservableCollection 在幕后实现 INPC