使用XAML在WPF项目中承载ArcGIS Engine地图控件开发
2010-09-07 16:41
549 查看
用Windows Form进行ArcGIS Engine二次开发时常见的形式,当然也可以用WPF来进行ArcEngine的二次开发。
由于WPF很方便承载Windows Form控件,而Map Control、Toolbar Control、TOC Control等都是.NET 控件,当然也可以用XAML来承载ArcEngine的这些控件来开发了。
下面简单记述开发步骤:
1.打开VS2008,创建WPF应用程序;
2.添加程序集引用:
ESRI.ArcGIS.AxControls:包含地图控件
ESRI.ArcGIS.System:包含ArcGIS Engine license初始化类
WindowsFormsIntegration:包含WindowsFormsHost,用来在WPF中承载Windows控件
System.Windows.Forms
3.在XAML中添加名称空间:
xmlns:controlHost="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
添加初始化事件Loaded="Window_Loaded"
4.在XAML中添加Map Control、Toolbar Control、TOC Control控件,最后你的XAML代码看起来是这样:
5.编辑XAML的C#代码,添加Map Control、Toolbar Control、TOC Control三个变量,即
AxMapControl mapControl;
AxToolbarControl toolbarControl;
AxTOCControl tocControl;
并在初始化窗口的下面添加对这三个控件变量的创建,即
6.在Window_Loaded事件中加载上述三个控件,如下:
7.将上述代码连起来,你的代码看起来是这样:
8.ArcEngine的二次开发当然要License啦,在Windwos From的开发中可以用License控件来进行许可证的初始化,在这里就只能用代码在App.XAML.cs中初始化License了。
代码如下:
9.在WPF中添加自定义工具,如在视图上画圆形的工具,添加DrawCircleToolClass类,如下:
注意:要添加ArcEngine的相关程序集的引用,如:ESRI.ArcGIS.ADF,ESRI.ArcGIS.Carti,ESRI.ArcGIS.Controls,ESRI.ArcGIS.Display,ESRI.ArcGIS.Geometry,ESRI.ArcGIS.SystemUI
10.在XAML中添加一个Button,并添加一个事件,DrawCircleTool_Click,在C#代码中添加该事件的代码如下:
11.最后执行程序,可以在加载地图文档,放大、缩小地图,也可以用自定义的画圆的工具在地图画圆。
由于WPF很方便承载Windows Form控件,而Map Control、Toolbar Control、TOC Control等都是.NET 控件,当然也可以用XAML来承载ArcEngine的这些控件来开发了。
下面简单记述开发步骤:
1.打开VS2008,创建WPF应用程序;
2.添加程序集引用:
ESRI.ArcGIS.AxControls:包含地图控件
ESRI.ArcGIS.System:包含ArcGIS Engine license初始化类
WindowsFormsIntegration:包含WindowsFormsHost,用来在WPF中承载Windows控件
System.Windows.Forms
3.在XAML中添加名称空间:
xmlns:controlHost="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
添加初始化事件Loaded="Window_Loaded"
4.在XAML中添加Map Control、Toolbar Control、TOC Control控件,最后你的XAML代码看起来是这样:
<Window x:Class="WPFMapViewer.MapWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MapViewer Hosted in WPF" Height="433.29" Width="559.944" Loaded="Window_Loaded" Background="Beige" MaxHeight="768" MaxWidth="1024" xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"> <Grid> <my:WindowsFormsHost Name="mapHost" Margin="174,30,0,22" /> <my:WindowsFormsHost Margin="0,30,0,22" Name="tocHost" HorizontalAlignment="Left" Width="173" /> <my:WindowsFormsHost Height="30" Name="toolbarHost" VerticalAlignment="Top" Margin="0,0,252,0" /> <Button Content="MyZoomInBoxTool" x:Name="MyZoomInBoxTool" Click="MyZoomInBox_Click" HorizontalAlignment="Right" Width="120" Height="30" VerticalAlignment="Top" Panel.ZIndex="1" Margin="0,0,7.056,0"></Button> <TextBlock Height="23.75" VerticalAlignment="Bottom" Name="textBlock1" Margin="0,0,7.056,0">Ready</TextBlock> <Button x:Name="DrawCircleTool" Height="23" HorizontalAlignment="Right" Margin="0,5,153,0" VerticalAlignment="Top" Width="75" Click="DrawCircleTool_Click">DrawCircle</Button> </Grid> </Window>
5.编辑XAML的C#代码,添加Map Control、Toolbar Control、TOC Control三个变量,即
AxMapControl mapControl;
AxToolbarControl toolbarControl;
AxTOCControl tocControl;
并在初始化窗口的下面添加对这三个控件变量的创建,即
private void CreateEngineControls () { mapControl = new AxMapControl (); mapHost.Child = mapControl; toolbarControl = new AxToolbarControl (); toolbarHost.Child = toolbarControl; tocControl = new AxTOCControl (); tocHost.Child = tocControl; }
6.在Window_Loaded事件中加载上述三个控件,如下:
private void LoadMap () { //将TOC控件、Toolbar控件和地图控件绑定 tocControl.SetBuddyControl (mapControl); toolbarControl.SetBuddyControl (mapControl); //添加放大、缩小、打开地图文档等命令到Toolbar工具栏 toolbarControl.AddItem ("esriControls.ControlsOpenDocCommand"); toolbarControl.AddItem ("esriControls.ControlsAddDataCommand"); toolbarControl.AddItem ("esriControls.ControlsSaveAsDocCommand"); toolbarControl.AddItem ("esriControls.ControlsMapNavigationToolbar"); toolbarControl.AddItem ("esriControls.ControlsMapIdentifyTool"); //设置工具栏的外观 toolbarControl.BackColor =Color.FromArgb (245, 245, 220); }
7.将上述代码连起来,你的代码看起来是这样:
public partial class MapWindow: Window
{
AxMapControl mapControl;
AxToolbarControl toolbarControl;
AxTOCControl tocControl;
public MapWindow ()
{
InitializeComponent ();
CreateEngineControls ();
}
private void CreateEngineControls ()
{
mapControl = new AxMapControl ();
mapHost.Child = mapControl;
toolbarControl = new AxToolbarControl ();
toolbarHost.Child = toolbarControl;
tocControl = new AxTOCControl ();
tocHost.Child = tocControl;
}
private void LoadMap () { //将TOC控件、Toolbar控件和地图控件绑定 tocControl.SetBuddyControl (mapControl); toolbarControl.SetBuddyControl (mapControl); //添加放大、缩小、打开地图文档等命令到Toolbar工具栏 toolbarControl.AddItem ("esriControls.ControlsOpenDocCommand"); toolbarControl.AddItem ("esriControls.ControlsAddDataCommand"); toolbarControl.AddItem ("esriControls.ControlsSaveAsDocCommand"); toolbarControl.AddItem ("esriControls.ControlsMapNavigationToolbar"); toolbarControl.AddItem ("esriControls.ControlsMapIdentifyTool"); //设置工具栏的外观 toolbarControl.BackColor =Color.FromArgb (245, 245, 220); }
private void Window_Loaded (object sender, RoutedEventArgs e)
{
LoadMap ();
}
}
8.ArcEngine的二次开发当然要License啦,在Windwos From的开发中可以用License控件来进行许可证的初始化,在这里就只能用代码在App.XAML.cs中初始化License了。
代码如下:
public partial class App: Application { public App () { InitializeEngineLicense (); } private void InitializeEngineLicense () { AoInitialize aoi = new AoInitializeClass (); esriLicenseProductCode productCode = esriLicenseProductCode.esriLicenseProductCodeEngine; if (aoi.IsProductCodeAvailable (productCode) == esriLicenseStatus.esriLicenseAvailable) { aoi.Initialize (productCode); } } }
9.在WPF中添加自定义工具,如在视图上画圆形的工具,添加DrawCircleToolClass类,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.ADF.BaseClasses; namespace WPFMapViewer.MapTool { [ClassInterface(ClassInterfaceType.None)] [Guid("48BD64CD-3369-47FC-8EC5-94A5B644E8DA")] public class DrawCircleToolClass : BaseTool { [ComRegisterFunction()] [ComVisible(false)] static void RegisterFunction(Type registerType) { ArcGISCategoryRegistration(registerType); } [ComUnregisterFunction()] [ComVisible(false)] static void UnregisterFunction(Type registerType) { ArcGISCategoryUnregistration(registerType); } private static void ArcGISCategoryRegistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT//CLSID//{{{0}}}", registerType.GUID); ControlsCommands.Register(regKey); } private static void ArcGISCategoryUnregistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT//CLSID//{{{0}}}", registerType.GUID); ControlsCommands.Unregister(regKey); } private IHookHelper m_hookHelper; private INewCircleFeedback m_feedBack; private IPoint m_point; private Boolean m_isMouseDown; private IDisplayFeedback displayFeedback = null; public DrawCircleToolClass() { m_hookHelper = new HookHelperClass(); } ~DrawCircleToolClass() { m_hookHelper = null; } public override void OnCreate(object hook) { m_hookHelper.Hook = hook; } public override bool Enabled { get { if (m_hookHelper.FocusMap == null) return false; return (m_hookHelper.FocusMap.LayerCount > 0); } } public override void OnMouseDown(int Button, int Shift, int X, int Y) { //Create a point in map coordinates IActiveView pActiveView = (IActiveView)m_hookHelper.FocusMap; m_point = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); displayFeedback = new NewCircleFeedbackClass(); m_isMouseDown = true; } public override void OnMouseMove(int button, int shift, int x, int y) { if (!m_isMouseDown) return; IActiveView pActiveView = (IActiveView)m_hookHelper.FocusMap; if (m_feedBack == null) { m_feedBack = new NewCircleFeedbackClass(); m_feedBack.Display = pActiveView.ScreenDisplay; m_feedBack.Start(m_point); } m_feedBack.MoveTo(pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y)); } public override void OnMouseUp(int button, int shift, int x, int y) { if (!m_isMouseDown) return; IActiveView pActiveView = (IActiveView)m_hookHelper.FocusMap; ICircularArc pCircle; pCircle = m_feedBack.Stop(); if (pCircle.Radius < 0.5) { m_feedBack = null; m_isMouseDown = false; } if (pCircle != null) { ISegmentCollection segCollection = new PolygonClass() as ISegmentCollection; object o = Type.Missing; segCollection.AddSegment(pCircle as ISegment, ref o, ref o); IPolygon polygon = segCollection as IPolygon; IRgbColor rgbColor = new RgbColorClass(); rgbColor.Red = 255; IColor color = rgbColor; ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass(); simpleFillSymbol.Color = color; IElement element; IPolygonElement polygonElement = new PolygonElementClass(); element = polygonElement as IElement; IFillShapeElement fillShapeElement = polygonElement as IFillShapeElement; fillShapeElement.Symbol = simpleFillSymbol; element.Geometry = polygon as IGeometry; IGraphicsContainer pGraphicContainer = pActiveView.GraphicsContainer; pGraphicContainer.AddElement(element, 0); pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); } m_feedBack = null; m_isMouseDown = false; } } }
注意:要添加ArcEngine的相关程序集的引用,如:ESRI.ArcGIS.ADF,ESRI.ArcGIS.Carti,ESRI.ArcGIS.Controls,ESRI.ArcGIS.Display,ESRI.ArcGIS.Geometry,ESRI.ArcGIS.SystemUI
10.在XAML中添加一个Button,并添加一个事件,DrawCircleTool_Click,在C#代码中添加该事件的代码如下:
//绘制圆形 private void DrawCircleTool_Click(object sender, RoutedEventArgs e) { ICommand DrawCircleTool = new DrawCircleToolClass(); DrawCircleTool.OnCreate(mapControl.Object); mapControl.CurrentTool = (ITool)DrawCircleTool; }
11.最后执行程序,可以在加载地图文档,放大、缩小地图,也可以用自定义的画圆的工具在地图画圆。
相关文章推荐
- 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发
- WPF下的地图开发控件(GMap.NET)使用心得—— GMap学习笔记(一)
- WPF下的地图开发控件(GMap.NET)使用心得—— GMap学习笔记(二)
- [WPF+ArcEngine]如何在WPF项目中使用ArcEngine的控件做开发
- VS2010下WPF开发ARCGIS ENGINE 10的带Ribbon控件项目
- 如何在WPF项目中使用ArcEngine的控件做开发
- 基于地图开发控件GMap.Net 使用 (五) 原创 用户自定义标签图片
- Winform下的地图开发控件(GMap.NET)使用心得之二
- arcgis api for flex 开发入门(三)地图浏览控件的使用
- WPF开发ArcGIS时候,Graphic模板中不能使用ViewBox控件的原因说明
- 如何在WPF程序中使用ArcGIS Engine的控件
- GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件
- arcgis api for flex 开发入门(三)地图浏览控件的使用
- 使用未编译的XAML动态生成WPF控件
- WebKit开发实战(一):在WPF中使用WebKit控件(含示例代码)
- 基于地图开发控件GMap.Net 使用 (一) 原创
- [原译]如何创建WPF用户控件&在WPF项目中使用
- GMap.NET地图开发控件使用心得
- Winform下的地图开发控件(GMap.NET)使用心得转载学习
- 基于地图开发控件GMap.Net 使用 (三) 原创