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 中用作点的模板。