在上一篇中,我说明了如何将MapControl添加到WPF中。
在添加过程我,我发现MapControl无法正常接收鼠标滚轮的放大缩小事件,期初我认为是由于MapControl放入WindowsFormsHost中,导致鼠标滚轮事件被WindowsFormsHost接收处理,MapControl并没有接收到鼠标滚轮事件。但是经过测试,发现这是错误的观点,因为WindowsFormsHost根本不会响应我的MouseWheel事件,也谈不上接收处理了。后来我发现在未加载地图时,MapControl可以正常的接收MouseWheel事件,但是加载完地图后就不支持了;根据这个情况,我推断可能是因为当加载地图后,MapControl失去了焦点,所以无法正常响应mouseWheel。MapControl是我在后台用代码添加的,打开地图文件我使用的是一个Button_Click事件,我在这个事件中设置了 this.MapControl.focus();确保每次加载地图后,MapControl都可以获取到焦点,然后就可以执行mousewheel事件,但是如过通过ToolBarcontrol 打开地图就又会失去焦点了,因此我在窗体的构造器中添加了
mapControl.OnMouseDown+=new IMapControlEvents2_AX_OnMouseDownEventHanlder(mapControl_OnMouseDown)
在它的mouseDown中添加Focus(),可以很好的解决这个问题。(PS:这只是我自己想的一个方法,无法保证每个人都适用或者一定正确,如何你们觉得这个方法有问题或者有更好的建议,请提出你们的建议,我们大家都可以学习学习)
由于在使用Network dataset分析时,会用到Query Interface,所有在此,对Quert Interface进行说明:
Quert Interface :一个类可以游多个接口,声明了接口变量并且指向一个对象的时候,这个对象只能使用该接口内的方法和属性,而不能访问其他接口中的方法和属性。如:
Dim pMap as IMap Set pMap=New Map pMay.Clear 这里会产生错误:此时的pMap只能使用IMap接口中定义的方法和属性,如获取图层的个数,添加图层等,但是不能清空视图上的内容(清空方法在IActiveView中定义) QueryInterface(QI)很方便的让我们在一个类的不同接口间进行切换:
Dim pView as IActiveView set pView=pMap ,此时可以使用pView调用在IActiveView中定义的方法。
例子如下:
interface IRose
{
void GirlName();
}
interface ITom
{
void BoyName();
}
class QITest:ITom,IRose
{
#region IRose 成员
public void GirlName()
{
MessageBox.Show("My Name is Rose");
}
#endregion
#region ITom 成员
public void BoyName()
{
MessageBox.Show("My Name is Tom");
}
#endregion
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
IRose nameinfo = new QITest();
nameinfo.GirlName();
//nameinfo.BoyName();// 报错
ITom boyname = nameinfo as ITom;
boyname.BoyName();
}
我没有在IRose中声明 BoyName方法,因此无法直接使用。当我
ITom boyname = nameinfo as ITom;
后,boyname可以正常使用ITom中定义的方法了。
Network dataset分析需要先创建无向网络。无向网络的创建分为在ArcCatalog中创建和在C#使用代码创建。
在ArcCatalog中创建无向网络只需要在FeatureSet 中右键,选择网络数据集向导,根据提示进行一步步的操作即可,具体我就不再多阐述了。
C#代码创建无向网络我是根据ArcGIS Engine 10 开发手册 进行编写的。基本与书上代码一致,需要这本书可以去这个链接下载,不需要资源分。点击打开链接http://download.youkuaiyun.com/detail/f815501810/7110923