场景如下:
小白:老白,我想在自己开发的form窗体中,点击发布服务按钮,能实现与桌面Ribbion上自带的发布服务一样的效果,有什么好方法?
老白:你可以尝试查一下是有这个公共方法,如果没有的话,自己写呗。
小白:我已经查过了,是内部私有的,无法获取,自己写。。。。
老白:你可以尝试"友元"或者“反射” 。
小白:友元太麻烦,反射不太通,东西急着要,我该怎么办!
老白:这样呀,既然底层走不通,可以换个思路,在想办法在最顶层包装一下它,拿到Ribbion上的按钮,调用一下点击事件Run() 方法不就行了。
小白:老白,快说。。。。
总结如下:
核心:获取ribbon 上的【发布服务】按钮,并调用Run()方法。
代码如下:
(获取基础Ribbon页名)
//遍历Ribbion上所有的页,在对应页中找到buttion, 调用对象下的Run() 方法。
for (int i = 0; i < SuperMap.Desktop.Application.ActiveApplication.MainForm.RibbonManager.Tabs.Length; i++){
IRibbonTab tabControl = SuperMap.Desktop.Application.ActiveApplication.MainForm.RibbonManager.Tabs[i];
if (tabControl.Text == "在线") {
tabControl.Build();
for (int j = 0; j < tabControl.Groups.Length; j++) {
IRibbonGroup ibase = tabControl.Groups[j] as IRibbonGroup;
if (ibase.Text == "服务"){
for (int v = 0; v < ibase.Items.Length; v++) {
IBaseItem button = ibase.Items[v];
if (button.Text == "发布服务") {
button.CtrlAction.Run();
}
}
}
}
}
}
(获取与当前窗体相关联的Ribbon页名)
// (获取)打印与当前窗体(场景)相关的Ribbon页
private void printRibbonTabsName(){
IRibbon formScene = SuperMap.Desktop.Application.ActiveForm as IFormScene; // 获取当前场景
if(fromScene != null){
// 获取与场景相关的Ribbon页
IRibbonTab[] ribbonTabs = SuperMap.Desktop.Application.ActiveApplication.MainForm.RibbonManager.GetMdiFormTabs(formScene);
if((ribbonTabs != null){
for(int index = 0; index < ribbonTabs.Length; index++){
SuperMap.Desktop.Application.ActiveApplication.Output.Output(ribbonTabs[index].Text);
}
}
}
}