Xaml Bing地图控件上的地图多段线

Xaml Bing地图控件上的地图多段线,xaml,bing-maps,uwp-xaml,uwp-maps,Xaml,Bing Maps,Uwp Xaml,Uwp Maps,我正在开发UWP导航应用程序 我想做什么? 我想在地图控件上绘制多条10的精确多段线。 我想要一个不同的颜色,而其他的是灰色的。 选择任意一条多段线后,新选定的多段线将变为原色,而其他多段线将变灰。类似于地图应用程序的多条路线只是在一个更大的比例,显示运输卡车的运动。 在线上到处都有通过c或codebehind实现多段线的方法,但我想通过XAML实现,因为从codebehind添加10条多段线在事件、不透明度、标记和名称方面没有太大的灵活性 我都试了些什么: 我尝试创建一条附加到mapEleme

我正在开发UWP导航应用程序

我想做什么? 我想在地图控件上绘制多条10的精确多段线。 我想要一个不同的颜色,而其他的是灰色的。 选择任意一条多段线后,新选定的多段线将变为原色,而其他多段线将变灰。类似于地图应用程序的多条路线只是在一个更大的比例,显示运输卡车的运动。 在线上到处都有通过c或codebehind实现多段线的方法,但我想通过XAML实现,因为从codebehind添加10条多段线在事件、不透明度、标记和名称方面没有太大的灵活性

我都试了些什么: 我尝试创建一条附加到mapElement的多段线,但这种方法的问题是,每次都必须删除并重新创建多段线以更改颜色。更多关于这个。而且,这只是一种从代码隐藏实现多段线的好方法

我目前正在做什么: 我在页面中添加了多段线的DataTemplate。参考资料如下:

 <DataTemplate x:Key="PolylineDataTemplate" x:DataType="polyLineData:IPolylinePath">
        <Polyline Points="{x:Bind Polyline,Mode=OneWay}" Fill="{x:Bind PolylineColor,Mode=OneWay}" Tag="{x:Bind PolylineTag,Mode=OneWay}" StrokeThickness="{x:Bind PolylineThinkness}" />
    </DataTemplate>`
<maps:MapControl x:Name="MyMap"  >
                <maps:MapItemsControl ItemTemplate="{StaticResource PolylineDataTemplate}" ItemsSource="{x:Bind ViewModel.PolylinePoints}"/>
            </maps:MapControl>
我只是在MapItems控件中调用它,如下所示:

 <DataTemplate x:Key="PolylineDataTemplate" x:DataType="polyLineData:IPolylinePath">
        <Polyline Points="{x:Bind Polyline,Mode=OneWay}" Fill="{x:Bind PolylineColor,Mode=OneWay}" Tag="{x:Bind PolylineTag,Mode=OneWay}" StrokeThickness="{x:Bind PolylineThinkness}" />
    </DataTemplate>`
<maps:MapControl x:Name="MyMap"  >
                <maps:MapItemsControl ItemTemplate="{StaticResource PolylineDataTemplate}" ItemsSource="{x:Bind ViewModel.PolylinePoints}"/>
            </maps:MapControl>
问题是: 代码运行得非常好。只有多段线不可见。 我以为它很小,所以我看不见。因此,我增加了大小和距离,它只是在左上角显示为一个小圆弧,有一定的间距,没有范围或平移

有人能帮忙吗

只有多段线不可见

首先,您似乎没有为提供属性,默认情况下,它为null。代码段使用“填充”属性设置“颜色”。如果该属性不用于线条的颜色,您可能会发现StrokeThickness的值对多段线没有影响,并且在没有Stroke属性的情况下,将看不到直线。因此,这里的颜色应该绑定到笔划属性

它只是在左上角显示为一个小圆弧

这是因为您通过代码行新建窗口.Posial.PositLoop.At纬度,Loosi.WordNess来构建折线点属性的点。 纬度和经度定义了MapControl上的元素位置,而不是应用程序视图。换句话说,实际上您向PointCollection添加了一个,而不是一个。因此,可能需要通过方法将地质点转换为点

不会得到范围或平移

为此,多段线实际上是一个地图元素,而不是一个地图元素。您应该通过侦听地图缩放事件来控制其地图位置。如果你想让它和地图一起平移,你应该使用。有关此示例,请参考的场景2。但是MapPolyline不能通过绑定直接添加,只能通过代码隐藏

一个完整的简单样本,基于您的测试,如下所示:

XAML

代码隐藏:

public sealed partial class MainPage : Page
{
    public List<PolylinePath> polylines { get; set; }
    Geopoint SeattleGeopoint = new Geopoint(new BasicGeoposition() { Latitude = 47.604, Longitude = -122.329 });       
    public MainPage()
    {
        this.InitializeComponent();
    }
    private void MyMap_Loaded(object sender, RoutedEventArgs e)
    {
        MyMap.Center = SeattleGeopoint;
        MyMap.ZoomLevel = 16;
    }
    private void btnaddpolyline_Click(object sender, RoutedEventArgs e)
    {
        polylines = new List<PolylinePath>()
        {
            new PolylinePath(MyMap)
            {
                PolylineColor=new SolidColorBrush(Colors.Red),
                PolylineThinkness=3,
                PolylineTag="testing",
                PolylinePoints = new List<BasicGeoposition>()
                {
                    SeattleGeopoint.Position,
                    new BasicGeoposition()
                    {
                        Latitude = SeattleGeopoint.Position.Latitude + 0.003,
                        Longitude = SeattleGeopoint.Position.Longitude - 0.003
                    }
                }
            }
        };
        mapitems.ItemsSource = polylines;
    }
}
public class PolylinePath
{
    public PolylinePath(MapControl MyMap)
    {
        this.MyMap = MyMap;
    }
    MapControl MyMap;
    public SolidColorBrush PolylineColor { get; set; }

    public int PolylineThinkness { get; set; }

    public string PolylineTag { get; set; }

    public IEnumerable<BasicGeoposition> PolylinePoints { get; set; }

    public PointCollection Polyline
    {
        get
        {
            PointCollection returnObject = new PointCollection();
            //could have used LINQ but wanted to check if the collection is being populated correctly
            foreach (var location in PolylinePoints)
            {
                Point actualpoint;
                MyMap.GetOffsetFromLocation(new Geopoint(location), out actualpoint);
                returnObject.Add(actualpoint);
            }
            return returnObject;
        }
    }
}

谢谢你的回答,但这没那么好用。它也不会缩放或移动它看起来更像是地图上的一个污点。使用只能从codebehind打印的MapPolyline,您能否建议一种方法来打印多条MapPolyline,并在选择一条MapPolyline时更改其颜色?这将非常有帮助。@AdityaSharma,在uwp map控件中没有使MapPloyline处于选中状态的API。看起来您正在寻找更多的强大功能。为此,您可以尝试使用。是一个UWP示例,具有类似的功能,希望您可以参考。感谢您的指导。最后一个简单的问题是,使用Bing地图SDK是否允许提供自定义地图磁贴源?通过矢量或光栅方式?我有一个要显示的热量和运输活动瓷砖层,而不是地图或其他视图。可能吗?这会很有帮助的+1链接。@AdityaSharma,我想答案是肯定的。看起来MapControl也有相关的功能,如果MapControl有,Bind应该可以做到。检查如果您有新的问题,您可以打开新的线程,我们将及时处理它们。感谢您的理解。很抱歉,我延长了时间,但我无法找到在UWP中的地图控件上使用矢量平铺的方法。我确实打开了一个线程,答案完全不同,它使我首先得到矢量图块,然后将它们制作成光栅图块,然后将其用作httpp图块源。你能提供一个更直接的答案吗?
public sealed partial class MainPage : Page
{
    public List<PolylinePath> polylines { get; set; }
    Geopoint SeattleGeopoint = new Geopoint(new BasicGeoposition() { Latitude = 47.604, Longitude = -122.329 });       
    public MainPage()
    {
        this.InitializeComponent();
    }
    private void MyMap_Loaded(object sender, RoutedEventArgs e)
    {
        MyMap.Center = SeattleGeopoint;
        MyMap.ZoomLevel = 16;
    }
    private void btnaddpolyline_Click(object sender, RoutedEventArgs e)
    {
        polylines = new List<PolylinePath>()
        {
            new PolylinePath(MyMap)
            {
                PolylineColor=new SolidColorBrush(Colors.Red),
                PolylineThinkness=3,
                PolylineTag="testing",
                PolylinePoints = new List<BasicGeoposition>()
                {
                    SeattleGeopoint.Position,
                    new BasicGeoposition()
                    {
                        Latitude = SeattleGeopoint.Position.Latitude + 0.003,
                        Longitude = SeattleGeopoint.Position.Longitude - 0.003
                    }
                }
            }
        };
        mapitems.ItemsSource = polylines;
    }
}
public class PolylinePath
{
    public PolylinePath(MapControl MyMap)
    {
        this.MyMap = MyMap;
    }
    MapControl MyMap;
    public SolidColorBrush PolylineColor { get; set; }

    public int PolylineThinkness { get; set; }

    public string PolylineTag { get; set; }

    public IEnumerable<BasicGeoposition> PolylinePoints { get; set; }

    public PointCollection Polyline
    {
        get
        {
            PointCollection returnObject = new PointCollection();
            //could have used LINQ but wanted to check if the collection is being populated correctly
            foreach (var location in PolylinePoints)
            {
                Point actualpoint;
                MyMap.GetOffsetFromLocation(new Geopoint(location), out actualpoint);
                returnObject.Add(actualpoint);
            }
            return returnObject;
        }
    }
}