MapControl c#UWP的扩展

时间:2016-05-17 07:59:39

标签: c# uwp extension-methods uwp-xaml uwp-maps

我必须在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,changer方法和属性中设置brakpoint时,我检测到了这一点。

1 个答案:

答案 0 :(得分:0)

1)创建TrackingMapControl:带有DependencyProperty的UserControl到集合

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