您的位置:首页 > 其它

[WPF+ArcEngine]如何在WPF项目中使用ArcEngine的控件做开发

2010-03-18 23:28 627 查看
平时做ArcEngine开发都是基于Winform. 自从装了VS2008之后,对WPF产生了非常浓厚的兴趣. 一直想结合WPF+ArcEngine做开发. 今天刚好在网上看到一点信息,尝试了一下,结果可行. 先将尝试过程公布一下:

1.使用WindowsFormsHost 控件.

WPF提供了承载(host) Windows form 控件的设置,允许开发在WPF应用中继续使用已存在的Windows Form 控件. 那么,实现这种可能的方法就是使用WindowsFormsHost 控件.WindowsFormsHost控件 允许在 WPF 页面上承载 Windows 窗体控件的元素.为单个window form控件提供了一个承载的容器,使得window form控件可以存在于WPF窗体或页面上.若要在 WPF 元素中承载 Windows 窗体控件,必须将 Windows 窗体控件分配给 Child 属性.有关WindowsFormsHost 控件的详细介绍,请参阅MSDN文档:

http://msdn.microsoft.com/zh-cn/library/system.windows.forms.integration.windowsformshost.aspx

2. 创建WPF应用程序

环境: VS2008 SP1+ArcEngine

创建一个WPF应用程序命名为WPFMapViewer,至于如何创建,这里就不多累赘了.

3.添加必要的引用

ESRI.ArcGIS.AxControls—包含了 AxMapControl
ESRI.ArcGIS.System—包含了 AoInitialiseClass类 (用于初始化 ArcGIS Engine 的许可)
WindowsFormsIntegration—包含了WindowsFormsHost 控件
System.Windows.Forms
System.Drawing
4.将WindowsFormsHost 从工具箱中拖放到窗体上,并打开MapWindow.xaml,添加WindowsFormsHost 的命名空间

xmlns:i="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"

5.为控件创建WindowsFormsHost . 由于一个WindowsFormsHost 只能承载一个window form的控件,因此我们需要为每一个我们用到的AE控件创建一个WindowsFormsHost .这里我们将会用到AxMapControl,AxToolbarControl,AxTOCControl.因此创建三个WindowsFormsHost 控件,分别命名为mapHost,toolbarHost,tocHost.

<i:WindowsFormsHost Height="32" Name="toolbarHost" VerticalAlignment="Top" />
<i:WindowsFormsHost HorizontalAlignment="Left" Margin="0,29,0,25" Name="tocHost" Width="166" />
<i:WindowsFormsHost Margin="167,29,0,25" Name="mapHost" />

6.经过以上的步骤后,完整的xaml应该是这样:

MapWindow

using System;
using System.Windows;
using System.Windows.Forms;
using System.Drawing;

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Controls;

namespace WPFMapViewer
{

public partial class MapWindow: Window
{
AxMapControl mapControl;
AxToolbarControl toolbarControl;
AxTOCControl tocControl;

public MapWindow ()
{
InitializeComponent ();
CreateEngineControls ();
}

/// <summary>
/// 创建Engine控件并将控件绑定到各自的 WindowsFormsHost 元素上
/// </summary>
void CreateEngineControls ()
{
//设置 Engine 控件到每个host的Child属性上
mapControl = new AxMapControl ();
mapHost.Child = mapControl;

toolbarControl = new AxToolbarControl ();
toolbarHost.Child = toolbarControl;

tocControl = new AxTOCControl ();
tocHost.Child = tocControl;
}

/// <summary>
/// 设置控件相关的属性
/// </summary>
private void SetControlsProperty ()
{
//设置控件之间的绑定关系
tocControl.SetBuddyControl (mapControl);
toolbarControl.SetBuddyControl (mapControl);

//添加命令按钮到toolbarControl
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);

//挂接事件
mapControl.OnMouseMove +=new IMapControlEvents2_Ax_OnMouseMoveEventHandler(mapControl_OnMouseMove);
}

void LoadMap()
{
string strMxd = @"e:\Untitled.mxd";
if (mapControl.CheckMxFile(strMxd))
mapControl.LoadMxFile(strMxd);
}
private void Window_Loaded (object sender, RoutedEventArgs e)
{
SetControlsProperty();
//加载地图
LoadMap();
}

private void mapControl_OnMouseMove (object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
textBlock1.Text = " X,Y Coordinates on Map: " + string.Format ("{0}, {1} {2}", e.mapX.ToString ("#######.##"), e.mapY.ToString ("#######.##"), mapControl.MapUnits.ToString ().Substring (4));
}
}
}

9. 调试,按F5.效果图如下:



10.总结

通过本试验可以得到一个启发:借助WindowsFormsHost,我们也能像WinForm一样开发我们的AE程序,同时,我们也注意到,在WPF中使用AE开发和在WinForm上没有很大的区别, 可以像在Winform下开发一样灵活.这里只是抛砖引玉, 有兴趣的可以更深入地开发一些复杂的AE功能,比方说自定义命令按钮并与地图交互等.

11. 实例下载

/Files/JinDin/WPFMapViewer.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: