您的位置:首页 > 其它

使用XAML在WPF项目中承载ArcGIS Engine地图控件开发

2013-07-22 18:19 423 查看
原文 http://blog.csdn.net/flexmapserver/article/details/5868882

用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代码看起来是这样:

[c-sharp] view plaincopyprint?

<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;

并在初始化窗口的下面添加对这三个控件变量的创建,即

[c-sharp] view plaincopyprint?

private void CreateEngineControls ()

{

mapControl = new AxMapControl ();

mapHost.Child = mapControl;

toolbarControl = new AxToolbarControl ();

toolbarHost.Child = toolbarControl;

tocControl = new AxTOCControl ();

tocHost.Child = tocControl;

}

6.在Window_Loaded事件中加载上述三个控件,如下:

[c-sharp] view plaincopyprint?

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.将上述代码连起来,你的代码看起来是这样:

[c-sharp] view plaincopyprint?

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了。

代码如下:

[c-sharp] view plaincopyprint?

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类,如下:

[c-sharp] view plaincopyprint?

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#代码中添加该事件的代码如下:

[c-sharp] view plaincopyprint?

//绘制圆形

private void DrawCircleTool_Click(object sender, RoutedEventArgs e)

{

ICommand DrawCircleTool = new DrawCircleToolClass();

DrawCircleTool.OnCreate(mapControl.Object);

mapControl.CurrentTool = (ITool)DrawCircleTool;

}

11.最后执行程序,可以在加载地图文档,放大、缩小地图,也可以用自定义的画圆的工具在地图画圆。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: