如何使用必应地图 WPF 控件

如何使用必应地图 WPF 控件

作者:WPFDevelopersOrg - 驚鏵

原文链接:https://github.com/WPFDevelopersOrg/WPFDevelopers

  • 框架使用.NET40

  • Visual Studio 2019;

  • Bing Maps WPF 控件需要 .NET Framework 4.0Windows SDK。这两个组件都随Microsoft Visual Studio VisualC#Visual Basic Express Edition一起安装。

  • 下面演示如何使用。

  • 引用 Microsoft.Maps.MapControl.WPF.dll 也可以在nuget上找到。

  • 添加命名空间。

  • 新建AMapTitleLayer.cs继承图层MapTileLayer实现加载高德地图瓦片.

1)新建 AMapTitleLayer.cs 代码如下:

using Microsoft.Maps.MapControl.WPF;
using System;namespace WPFDevelopers.Samples.ExampleViews
{public class AMapTitleLayer : MapTileLayer{public AMapTitleLayer(){TileSource = new AMapTileSource();}public string UriFormat{get { return TileSource.UriFormat; }set { TileSource.UriFormat = value; }}}public class AMapTileSource : TileSource{public override Uri GetUri(int x, int y, int zoomLevel){string url = string.Format("http://wprd01.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scl=1&style=7", x, y, zoomLevel);return new Uri(url, UriKind.Absolute);}}
}

2)新建PushpinModel.cs 代码如下:

using Microsoft.Maps.MapControl.WPF;namespace WPFDevelopers.Samples.ExampleViews
{public class PushpinModel{public Location Location { get; set; }public int ID { get; set; }public string Title { get; set; }}
}

3)新建 BingAMapExample.xaml 代码如下:

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.BingAMapExample"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"xmlns:map="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF"xmlns:mapOverlays="clr-namespace:Microsoft.Maps.MapControl.WPF.Overlays;assembly=Microsoft.Maps.MapControl.WPF"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><UserControl.Resources><LinearGradientBrush x:Key="MainColor" EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="#FF020621" Offset="0"/><GradientStop Color="#FF364BD8" Offset="1"/><GradientStop Color="#FF5A6BD8" Offset="0.499"/></LinearGradientBrush><ControlTemplate x:Key="CarTemplate" TargetType="map:Pushpin"><Grid ToolTip="物资车辆"><Ellipse Width="35" Height="35" Fill="White" StrokeThickness="3" Stroke="Red"/><Image Source="pack://application:,,,/WPFDevelopers.Samples;component/Images/AMap/Car2.png" Width="25" Height="25"/></Grid></ControlTemplate><SineEase x:Key="SineOut" EasingMode="EaseOut" /><Storyboard x:Key="AnimateRound" RepeatBehavior="Forever"><DoubleAnimation Storyboard.TargetProperty="ScaleX" Storyboard.TargetName="Scale"Duration="0:0:01" To="2" EasingFunction="{StaticResource SineEaseOut}" /><DoubleAnimation Storyboard.TargetProperty="ScaleY" Storyboard.TargetName="Scale"Duration="0:0:01" To="2" EasingFunction="{StaticResource SineEaseOut}" /><DoubleAnimation Storyboard.TargetProperty="Opacity"  Duration="0:0:01" To="0" EasingFunction="{StaticResource SineEaseOut}" /></Storyboard><Style x:Key="alarmStyle" TargetType="map:Pushpin"><Setter Property="PositionOrigin" Value="Center"/><Setter Property="Width" Value="60"/><Setter Property="Height" Value="60"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="map:Pushpin"><Grid><Ellipse Height="40" Width="40" Fill="Red" RenderTransformOrigin="0.5,0.5"><Ellipse.OpacityMask><RadialGradientBrush><GradientStop Offset="0" Color="Transparent" /><GradientStop Offset="1" Color="Black" /></RadialGradientBrush></Ellipse.OpacityMask><Ellipse.RenderTransform><ScaleTransform x:Name="Scale"/></Ellipse.RenderTransform><Ellipse.Triggers><EventTrigger RoutedEvent="Loaded"><BeginStoryboard Storyboard="{StaticResource AnimateRound}"></BeginStoryboard></EventTrigger></Ellipse.Triggers></Ellipse><Viewbox Width="30" Height="30" VerticalAlignment="Top" HorizontalAlignment="Center"Margin="20,0,0,0"><Path Data="{StaticResource PathFlag}" Fill="Orange"/></Viewbox></Grid></ControlTemplate></Setter.Value></Setter></Style></UserControl.Resources><Grid><map:Map x:Name="map" ZoomLevel="5" Center="39.9132801985722,116.392009995601"CredentialsProvider="AgXB7m7fVYxKpjEZV9rGdrRPvLgawYhi4Wvw99kk4RDspoalC3B_vQ8GKJAoxrve"><map:Map.Mode><map:MercatorMode/></map:Map.Mode><local:AMapTitleLayer/><map:MapItemsControl ItemsSource="{Binding PushpinArray,RelativeSource={RelativeSource AncestorType=local:BingAMapExample}}"><map:MapItemsControl.ItemTemplate><DataTemplate><map:Pushpin Location="{Binding Location}" Cursor="Hand" MouseDown="Pushpin_MouseDown"ToolTip="{Binding Title}"Background="Red"><TextBlock Text="{Binding ID}"/></map:Pushpin></DataTemplate></map:MapItemsControl.ItemTemplate></map:MapItemsControl><map:Pushpin Location="36.6797276003243,118.495410536117" Style="{StaticResource alarmStyle}"/><Canvas Width="50" Height="80" map:MapLayer.Position="31.9121578992881,107.233555852083" map:MapLayer.PositionOrigin="BottomCenter" Opacity="0.7"><Path Data="M 0,0 L 50,0 50,50 25,80 0,50 0,0" Fill="ForestGreen" Stroke="Wheat" StrokeThickness="2" /><TextBlock FontSize="10" Foreground="White" Padding="10" TextAlignment="Center">这里是 <LineBreak />四川 <LineBreak />通江县 <LineBreak /></TextBlock></Canvas><map:MapLayer x:Name="CarLayer"/></map:Map><DockPanel><Grid DockPanel.Dock="Top"><Path Data="M75.811064,0 L275.81107,0 275.81107,39.999999 267.12714,39.999999 267.12798,40.000499 67.127973,40.000499 0,0.00050140842 75.811064,0.00050140842 z"Width="200" Height="30" Stretch="Fill" Opacity=".8" Stroke="#FFCCFEFF" StrokeThickness="1.5" Fill="{StaticResource MainColor}"><Path.RenderTransform><SkewTransform AngleX="-40"/></Path.RenderTransform></Path><TextBlock Text="预警指挥平台" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"FontSize="16" FontWeight="Black"/></Grid><Grid DockPanel.Dock="Left" Width="200"HorizontalAlignment="Left" ><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition/><RowDefinition Height="Auto"/></Grid.RowDefinitions><Rectangle Grid.RowSpan="3" Fill="#FF364BD8" Opacity=".8" Stroke="#FFCCFEFF" StrokeThickness="1.5"/><TextBlock Text="数据信息" FontSize="16" Foreground="White" Margin="10,10,0,0"/><ItemsControl ItemsSource="{Binding PushpinArray,RelativeSource={RelativeSource AncestorType=local:BingAMapExample}}"Margin="4,10" Grid.Row="1"><ItemsControl.ItemTemplate><DataTemplate><Grid Margin="4" x:Name="PART_Grid"MouseLeftButtonDown="PART_Grid_MouseLeftButtonDown"Tag="{Binding ID}"><Grid.Resources><Style TargetType="TextBlock"><Setter Property="Foreground" Value="White"/><Setter Property="FontSize" Value="16"/></Style></Grid.Resources><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition/></Grid.ColumnDefinitions><Ellipse Width="20" Height="20" Fill="OrangeRed"/><TextBlock Text="{Binding ID}" HorizontalAlignment="Center"/><TextBlock Margin="4,0" Grid.Column="1" Text="{Binding Title}"/></Grid><DataTemplate.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" TargetName="PART_Grid" Value="#FF020621"/></Trigger></DataTemplate.Triggers></DataTemplate></ItemsControl.ItemTemplate></ItemsControl><Button Content="物资轨迹" Click="BtnCar_Click" Grid.Row="2" Height="40" Style="{StaticResource PrimaryButton}"/></Grid></DockPanel></Grid>
</UserControl>

4)新建 BingAMapExample.xaml.cs 逻辑代码如下:

  • 点击左侧列表的point点地图定位到并放大层级到16级。

using Microsoft.Maps.MapControl.WPF;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;namespace WPFDevelopers.Samples.ExampleViews
{/// <summary>/// BingAMapExample.xaml 的交互逻辑/// </summary>public partial class BingAMapExample : UserControl{private LocationCollection _polyLocations;private MapPolyline mapPolyline;private Pushpin carPushpin;private DispatcherTimer dispatcherTimer;private List<Location> locations;public IEnumerable PushpinArray{get { return (IEnumerable)GetValue(PushpinArrayProperty); }set { SetValue(PushpinArrayProperty, value); }}public static readonly DependencyProperty PushpinArrayProperty =DependencyProperty.Register("PushpinArray", typeof(IEnumerable), typeof(BingAMapExample), new PropertyMetadata(null));public BingAMapExample(){InitializeComponent();var pushpins = new List<PushpinModel>();pushpins.Add(new PushpinModel { ID = 1, Location = new Location(39.8151940395589, 116.411970893135), Title = "和义东里社区" });pushpins.Add(new PushpinModel { ID = 2, Location = new Location(39.9094878843105, 116.33299936282), Title = "中国水科院南小区" });pushpins.Add(new PushpinModel { ID = 3, Location = new Location(39.9219204792284, 116.203500574855), Title = "石景山山姆会员超市" });pushpins.Add(new PushpinModel { ID = 4, Location = new Location(39.9081417418219, 116.331244439925), Title = "茂林居小区" });PushpinArray = pushpins;_polyLocations = new LocationCollection();_polyLocations.Add(new Location(39.9082973053021, 116.63105019548));_polyLocations.Add(new Location(31.9121578992881, 107.233555852083));mapPolyline = new MapPolyline{Stroke = Brushes.Green,StrokeThickness = 2,Locations = _polyLocations,};CarLayer.Children.Add(mapPolyline);carPushpin = new Pushpin{Template = this.Resources["CarTemplate"] as ControlTemplate,Location = new Location(31.9121578992881, 107.233555852083),PositionOrigin = PositionOrigin.Center,};CarLayer.Children.Add(carPushpin);dispatcherTimer = new DispatcherTimer();dispatcherTimer.Interval = TimeSpan.FromSeconds(1.5);dispatcherTimer.Tick += DispatcherTimer_Tick;}int index = 0;private void DispatcherTimer_Tick(object sender, EventArgs e){if (index < 0){index = locations.Count - 1;dispatcherTimer.Stop();return;}carPushpin.Location = locations[index];index--;}private void BtnCar_Click(object sender, RoutedEventArgs e){locations = new List<Location>();locations.Add(new Location(39.9082973053021, 116.63105019548));locations.Add(new Location(39.0654365763652, 115.513103745601));locations.Add(new Location(38.5861378332358, 114.897869370601));locations.Add(new Location(38.0690298850334, 114.238689683101));locations.Add(new Location(37.4436424646135, 113.491619370601));locations.Add(new Location(36.8833163124675, 112.832439683101));locations.Add(new Location(36.6015984304246, 112.480877183101));locations.Add(new Location(36.2125510101126, 112.041424058101));locations.Add(new Location(35.6074752751952, 111.426189683101));locations.Add(new Location(34.9977887035825, 110.591228745601));locations.Add(new Location(34.456028305434, 109.932049058101));locations.Add(new Location(33.9836399832877, 109.580486558101));locations.Add(new Location(33.5086116028286, 108.965252183101));locations.Add(new Location(33.1046158275268, 108.525799058101));locations.Add(new Location(32.6617655474571, 108.042400620601));locations.Add(new Location(32.179523137361, 107.515056870601));locations.Add(new Location(31.9121578992881, 107.233555852083));index = locations.Count - 1;dispatcherTimer.Start();}private void Map_MouseDown(object sender, MouseButtonEventArgs e){Point mousePosition = e.GetPosition(this);Location pinLocation = this.map.ViewportPointToLocation(mousePosition);}private void Pushpin_MouseDown(object sender, MouseButtonEventArgs e){var model = sender as Pushpin;map.Center = model.Location;map.ZoomLevel = 16;}private void PART_Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){var grid = sender as Grid;var model = PushpinArray.OfType<PushpinModel>().FirstOrDefault(x => x.ID.Equals(grid.Tag));map.Center = model.Location;map.ZoomLevel = 16;}}
}

Github|BingAMapExample[1]
码云|BingAMapExample[2]

参考资料

[1]

Github|BingAMapExample: https://github.com/WPFDevelopersOrg/WPFDevelopers/blob/master/src/WPFDevelopers.Samples/ExampleViews/Map/BingAMapExample.xaml

[2]

码云|BingAMapExample: https://gitee.com/WPFDevelopersOrg/WPFDevelopers/blob/master/src/WPFDevelopers.Samples/ExampleViews/Map/BingAMapExample.xaml

如何使用必应地图 WPF 控件相关推荐

  1. Winform下的地图开发控件(GMap.NET)使用心得

    原文地址为: Winform下的地图开发控件(GMap.NET)使用心得 我们先看看GMap.NET的定义: GMap.NET是一个强大.免费.跨平台.开源的.NET控件,它在Windows Form ...

  2. DevExpress v15.1:WPF控件升级(四)

    2019独角兽企业重金招聘Python工程师标准>>> <下载最新版DevExpress WPF Controls v15.1.5> WPF编辑器 在Token编辑器中的 ...

  3. Winform下的地图开发控件(GMap.NET)使用心得之二

    在上篇<Winform下的地图开发控件(GMap.NET)使用心得>中简单介绍了GMap.NET的控件基本情况,本篇开始介绍一下相关的代码操作. 其实目前GMap.NET提供的功能还不是很 ...

  4. wpf控件设计时支持(2)

    原文:wpf控件设计时支持(2) 这篇介绍在wpf设计时集合项属性添加项的定义和自定义控件右键菜单的方法 集合项属性设计时支持 1.为集合属性设计器识别具体项类型 wpf设计器允许定义集合项的类型,如 ...

  5. wpf控件开发基础(1)

    从现在开始,我将尝试写有关wpf控件开发相关的知识,把文章这对我来说很难,所以这个系列的文章在时间跨度上可能会拖的比较长.我希望我介绍是比较详细的,而不仅仅是一个简单的控件开发流程.我是一个真正的We ...

  6. 在WinForm应用程序中嵌入WPF控件(转)

      我们知道,在WPF界面上添加WinForm的控件需要使用WindowsFormHost类.而在WinForm界面上添加WPF控件该如何做呢?有没有类似的类呢?明显是有的,ElementHost就是 ...

  7. [转] 使用模板自定义 WPF 控件

      [转] 使用模板自定义 WPF 控件                                                                                 ...

  8. wpf控件设计时支持(1)

    wpf控件设计时支持(1) 原文:wpf控件设计时支持(1) 这部分内容几乎是大家忽略的内容,我想还是来介绍一下. 本篇源码下载 1.属性元数据 在vs IDE中,在asp.net,winfrom等开 ...

  9. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(四)地图导航控件模块...

    config.xml文件的配置如下: <widget left="10" top="50" config="widgets/Navigation ...

最新文章

  1. CentOS-7.2部署Squid服务
  2. springboot 读取bootStrap.properties流程
  3. fputc会覆盖吗_墨粉寿命和打印的文件有关系吗?
  4. jert oracle 统计说明,Oracle JET简单入门(一)Oracle JET介绍
  5. python清除列表内容_Python 列表的清空方式
  6. Error: Cannot retrieve metalink for repository: epel.
  7. access日期如何增加年数_MATLAB的时间与日期
  8. Axure8.0如何汉化?
  9. 阳阳智能开关固件2.0版本
  10. UE4 C++ 通过Spline绘制任意道路
  11. linux定时任务_linux定时任务
  12. 广州羚羊社科技跑付app健身中心开业,涉足健身领域,人头爆满全场热销
  13. 盘点机数据怎么转换成电脑盘点系统的数据
  14. PHP时间差七个小时怎么回事,php 怎么解决8小时时间差的问题
  15. 认识计算机选题背景,与计算机专业相关的论文_计算机专业的毕业论文题目有哪些_大一我对计算机的认识3000字论文...
  16. 编译iMX8安卓源代码笔记
  17. C#串口通讯+BigEndian+Little-Endian(大端和小端方案)
  18. 公文专用计算机,[计算机]常用公文写作方法.doc
  19. Markdown标记语言速学
  20. vue3.2使用vue-wechat-title及路由导航守卫实现浏览器动态标题、替换浏览器的vue小图标

热门文章

  1. SSM驾校预约练车管理系统 计算机毕设源码27864
  2. 6.docker container
  3. 计算机显示屏对比度怎么调整,如何在笔记本电脑上调整显示器的亮度和对比度...
  4. 山东大学软件学院优秀大学生暑期夏令营通知
  5. 企业电子招投标采购系统源码之功能模块功能描述
  6. 大学python编程题_大学python题 求大佬解答!!!
  7. ResultSet的介绍与使用
  8. DASCTF2022十月挑战赛部分WP
  9. C++静态成员变量初始化和赋值
  10. 无线MAC地址过滤怎么设置