1、同一Add-in中组件之间的交互
创建一个插件,往往需要各个组件能够相互交互。例如,通过一个按钮(button)的事件触发一些信息显示在浮动窗口(dockwindow)中。Add-in提供了一种很直观的编程方式,只需要相应组件类实现过去组件引用的静态方法,在其他组件中调用该方法以实现交互。代码如下:
[C#]
public class MainExt: ESRI.ArcGIS.Desktop.AddIns.Extension
{
private static MainExt s_extension;
public MainExt()
{
s_extension = this;
}
internal static MainExt GetExtension()
{
// Extension loads just in time, call FindExtension to load it.
if (s_extension == null)
{
UID extID = new UIDClass();
extID.Value = ThisAddIn.IDs.MainExt;
ArcMap.Application.FindExtensionByCLSID(extID);
}
return s_extension;
}
internal void DoWork()
{
System.Windows.Forms.MessageBox.Show("Do work");
}
}
protected override void OnClick()
{
MainExt mainExt = MainExt.GetExtension();
mainExt.DoWork();
}
首先,Extension类型组件MainExt类实现了静态方法GetExtension,然后在其他组件中通过GetExtension获取引用,然后调用组件的相关方法
2、静态方法AddIn.FromID
静态方法AddIn.FromID也可以通过add-in ID获取add-in对象的引用。
[C#]
protected override void OnClick()
{
var ext = AddIn.FromID < Addin1Ext > (ThisAddIn.IDs.Addin1Ext);
ext.MyCustomMethod();
}
3、extension对象的使用
良好编程习惯是应用一个中心对象来存储对象的状态和管理组件之间的交互,Extension对象就比较适合充当这一角色。
使能和检查控件状态
通过OnUpdate()方法更新和检查控件的状态
[C#]
protected override void OnUpdate()
{
this.Enabled = m_enabled;
}
void mapEvents_SelectionChanged()
{
m_enabled = m_focusMap.SelectionCount > 0;
}
上面的代码通过mapEvents_SelectionChanged事件获取实时状态,并通过OnUpdate()方法修改控件状态