MapControl c# UWP 的扩展
Extension for MapControl c# UWP
我必须在 MapControl 上画线。我有 XAML 查看我的 MapControl:
<Maps:MapControl x:Name="mapMain"
MapServiceToken="{StaticResource MapServiceTokenString}"
RenderTransformOrigin="0.5,0.5"
Margin="0,0,0,0"
extentions:PolyLineMapControl.ItemsCollection="{Binding mapViewModel.PointsOfNodes}">
<Maps:MapItemsControl x:Name="ItemsChanged"
ItemsSource="{x:Bind mapViewModel.PointsOfNodes, Mode=OneWay}">
<Maps:MapItemsControl.ItemTemplate>
<DataTemplate x:DataType="data:PointOfNode">
<StackPanel>
<Border Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{x:Bind DisplayName, Mode=OneWay}"/>
</Border>
<Image Source="{x:Bind ImageSourcePath, Mode=OneWay}"
Maps:MapControl.Location="{x:Bind Location, Mode=OneWay}"
Maps:MapControl.NormalizedAnchorPoint="{x:Bind NormalizedAnchorPoint, Mode=OneWay}">
<Image.Transitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</Image.Transitions>
</Image>
</StackPanel>
</DataTemplate>
</Maps:MapItemsControl.ItemTemplate>
</Maps:MapItemsControl>
</Maps:MapControl>
我成功地从 mapViewModel 获得了分数,但扩展不起作用。
public class PolyLineMapControl
{
public static readonly DependencyProperty ItemsCollectionProperty = DependencyProperty.RegisterAttached("ItemsCollection", typeof(List<PointOfNode>), typeof(PolyLineMapControl), new PropertyMetadata(default(List<PointOfNode>), OnItemsChanged));
public static List<PointOfNode> GetItemsCollection(DependencyObject obj)
{
return (List<PointOfNode>)obj.GetValue(ItemsCollectionProperty);
}
public static void SetItemsCollection(DependencyObject obj, List<PointOfNode> value)
{
obj.SetValue(ItemsCollectionProperty, value);
}
private static void OnItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//draw line
}
}
属性初始化成功。
当我在 setter、getter、转换器方法和 属性 中设置 brakpoint 时,我检测到了这一点。
1) 创建 TrackingMapControl : UserControl with DependencyProperty to collection
private static readonly DependencyProperty.Register(
"PointsOfNodes",
typeof(ObservableCollection<PointOfNode>),
typeof(MapControl),
new PropertyMetadata(new ObservableCollection<PointOfNode>()));
public ObservableCollection<PointOfNode> PointsOfNodes
{
get { return (ObservableCollection<PointOfNode>)this.GetValue(PointsOfNodesProperty); }
set { this.SetValue(PointsOfNodesProperty, value); }
}
2) 创建 onChangeCollection 方法,其中在指向 MapControl 的点之间画线
private void OnMapItemsPropertyChanged(DependencyObject sender, DependencyProperty dp)
{
var mapItemsControls = sender as MapItemsControl;
var mapItemsSource = mapItemsControls?.ItemsSource as ObservableCollection<PointOfNode>;
if (mapItemsSource != null)
{
this.MainMap.MapElements.Clear();
if (mapItemsSource.Count > 1)
{
for (var i = 0; i < mapItemsSource.Count - 1; i++)
{
this.LinePoints(mapItemsSource[i].Location, (mapItemsSource[i + 1]).Location);
}
}
}
}
3) 创建MapIconControl: UserControl 将在TrackingMapControl 中用作点的模板。
我必须在 MapControl 上画线。我有 XAML 查看我的 MapControl:
<Maps:MapControl x:Name="mapMain"
MapServiceToken="{StaticResource MapServiceTokenString}"
RenderTransformOrigin="0.5,0.5"
Margin="0,0,0,0"
extentions:PolyLineMapControl.ItemsCollection="{Binding mapViewModel.PointsOfNodes}">
<Maps:MapItemsControl x:Name="ItemsChanged"
ItemsSource="{x:Bind mapViewModel.PointsOfNodes, Mode=OneWay}">
<Maps:MapItemsControl.ItemTemplate>
<DataTemplate x:DataType="data:PointOfNode">
<StackPanel>
<Border Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{x:Bind DisplayName, Mode=OneWay}"/>
</Border>
<Image Source="{x:Bind ImageSourcePath, Mode=OneWay}"
Maps:MapControl.Location="{x:Bind Location, Mode=OneWay}"
Maps:MapControl.NormalizedAnchorPoint="{x:Bind NormalizedAnchorPoint, Mode=OneWay}">
<Image.Transitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</Image.Transitions>
</Image>
</StackPanel>
</DataTemplate>
</Maps:MapItemsControl.ItemTemplate>
</Maps:MapItemsControl>
</Maps:MapControl>
我成功地从 mapViewModel 获得了分数,但扩展不起作用。
public class PolyLineMapControl
{
public static readonly DependencyProperty ItemsCollectionProperty = DependencyProperty.RegisterAttached("ItemsCollection", typeof(List<PointOfNode>), typeof(PolyLineMapControl), new PropertyMetadata(default(List<PointOfNode>), OnItemsChanged));
public static List<PointOfNode> GetItemsCollection(DependencyObject obj)
{
return (List<PointOfNode>)obj.GetValue(ItemsCollectionProperty);
}
public static void SetItemsCollection(DependencyObject obj, List<PointOfNode> value)
{
obj.SetValue(ItemsCollectionProperty, value);
}
private static void OnItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//draw line
}
}
属性初始化成功。 当我在 setter、getter、转换器方法和 属性 中设置 brakpoint 时,我检测到了这一点。
1) 创建 TrackingMapControl : UserControl with DependencyProperty to collection
private static readonly DependencyProperty.Register(
"PointsOfNodes",
typeof(ObservableCollection<PointOfNode>),
typeof(MapControl),
new PropertyMetadata(new ObservableCollection<PointOfNode>()));
public ObservableCollection<PointOfNode> PointsOfNodes
{
get { return (ObservableCollection<PointOfNode>)this.GetValue(PointsOfNodesProperty); }
set { this.SetValue(PointsOfNodesProperty, value); }
}
2) 创建 onChangeCollection 方法,其中在指向 MapControl 的点之间画线
private void OnMapItemsPropertyChanged(DependencyObject sender, DependencyProperty dp)
{
var mapItemsControls = sender as MapItemsControl;
var mapItemsSource = mapItemsControls?.ItemsSource as ObservableCollection<PointOfNode>;
if (mapItemsSource != null)
{
this.MainMap.MapElements.Clear();
if (mapItemsSource.Count > 1)
{
for (var i = 0; i < mapItemsSource.Count - 1; i++)
{
this.LinePoints(mapItemsSource[i].Location, (mapItemsSource[i + 1]).Location);
}
}
}
}
3) 创建MapIconControl: UserControl 将在TrackingMapControl 中用作点的模板。