詳解WPF如何使用必應(yīng)地圖控件
如何使用必應(yīng)地圖 WPF 控件
- 框架使用
.NET40; Visual Studio 2019;Bing Maps WPF控件需要.NET Framework 4.0和Windows SDK。這兩個組件都隨Microsoft Visual Studio VisualC#或Visual Basic Express Edition一起安裝。- 下面演示如何使用。
- 引用
Microsoft.Maps.MapControl.WPF.dll也可以在nuget上找到。 - 添加命名空間。
- 新建
AMapTitleLayer.cs繼承圖層MapTileLayer實現(xiàn)加載高德地圖瓦片.
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="預(yù)警指揮平臺"?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="數(shù)據(jù)信息"?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 邏輯代碼如下:
點擊左側(cè)列表的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?=?"和義東里社區(qū)"?});
????????????pushpins.Add(new?PushpinModel?{?ID?=?2,?Location?=?new?Location(39.9094878843105,?116.33299936282),?Title?=?"中國水科院南小區(qū)"?});
????????????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?=?"茂林居小區(qū)"?});
????????????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;
????????}
????}
}效果

到此這篇關(guān)于詳解WPF如何使用必應(yīng)地圖控件的文章就介紹到這了,更多相關(guān)WPF必應(yīng)地圖控件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity3D Shader實現(xiàn)動態(tài)星空
這篇文章主要為大家詳細介紹了Unity3D Shader實現(xiàn)動態(tài)星空,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04
C#匿名方法與Delegate類型轉(zhuǎn)換錯誤分析
這篇文章主要介紹了C#匿名方法與Delegate類型轉(zhuǎn)換錯誤,較為詳細的分析了C#匿名方法的用法及Delegate類型轉(zhuǎn)換錯誤問題解決方法,具有一定的實用價值,需要的朋友可以參考下2014-11-11
C#基于Socket套接字的網(wǎng)絡(luò)通信封裝
這篇文章主要為大家詳細介紹了C#基于Socket套接字的網(wǎng)絡(luò)通信封裝本文實例為大家分享了Java實現(xiàn)圖片旋轉(zhuǎn)的具體代碼,供大家參考,具體內(nèi)容如下2021-11-11
C#探秘系列(四)——GetHashCode,ExpandoObject
這篇繼續(xù)分享下GetHashCode和ExpandoObject這兩個比較好玩的方法。2014-05-05
c#不使用系統(tǒng)api實現(xiàn)可以指定區(qū)域屏幕截屏功能
這篇文章主要介紹了不使用系統(tǒng)API通過純c#實現(xiàn)屏幕指定區(qū)域截屏功能,截屏后還可以保存圖象文件,大家參考使用吧2014-01-01

