C#/Vsto中CustomTaskPanes和Ribbon的使用方法
在工作中有一个需求,需要添加工作区选项卡,Excel中CustomTaskPanes面板很适合这样的场景,而非集中处理在Excel的Ribbon面板中,毕竟在大型项目中表现层已经过于复杂了。首先写一个显示Panes的方法。
var sr = new OtherShouldReceiveUserControl(Wb, Wb.Application);
var dpi = sr.dpiValue;
sr.Name = "OtherShouldReceiveUserControl";
var customTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(sr, "快速导航");
customTaskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;
customTaskPane.DockPositionRestrict = MsoCTPDockPositionRestrict
.msoCTPDockPositionRestrictNoChange;
customTaskPane.Visible = true;
而这个方法我们会在worksheet active中触发。
app = Globals.ThisAddIn.Application;
app.SheetActivate += App_SheetActivate;
private void App_SheetActivate(object Sh)
{
CommonUtils.CallShowNavicatButton(CurWorkbook, curWorksheet.Name);
}
在SheetActive中调用方法,不过有一个问题,每次Active处罚之后都会Add OtherShouldReceiveUserControl 用户控件,它会出现用户控件重复添加的情况,所以你需要做一定的冗余处理。如何处理呢?
Worksheet worksheet = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet;
var EnableNavicat = GetEnableNavicat();
if (EnableNavicat == "false")
{ return; }
if (Wb.Application.Visible)
{
#region 删除导航,激活其他excel必须用目前方法
int i = -1;
int deleteIndex = -1;
foreach (var panel in Globals.ThisAddIn.CustomTaskPanes)
{
i++;
try
{
if (panel != null && (panel.Title == "快速导航")
{
panel.Visible = false;
deleteIndex = i; break;
}
}
catch { }
}
if (deleteIndex >= 0)
{
//移除导航
try
{
Globals.ThisAddIn.CustomTaskPanes.RemoveAt(deleteIndex);
}
catch { }
}
首先遍历 Globals.ThisAddIn.CustomTaskPanes 中的所有panel,如果Title是我们刚才添加的,或许你可以使用Tag来判断,这由你而定。随后通过 RemoveAt 方法来进行Delete操作。值得注意还有一个参数需要说说, MsoCTPDockPosition 改变Panel的 DockPosition 排列方式。一般使用Float即可。
//
// 摘要:
// Specifies the docking behavior of the custom task pane.
public enum MsoCTPDockPosition
{
//
// 摘要:
// Dock the task pane on the left side of the document window.
msoCTPDockPositionLeft = 0,
//
// 摘要:
// Dock the task pane at the top of the document window.
msoCTPDockPositionTop = 1,
//
// 摘要:
// Dock the task pane on the right side of the document window.
msoCTPDockPositionRight = 2,
//
// 摘要:
// Dock the task pane at the bottom of the document window.
msoCTPDockPositionBottom = 3,
//
// 摘要:
// Don't dock the task pane.
msoCTPDockPositionFloating = 4
}
在此之前,我要创建一个Ribbon,百思不得其解的是Vsto是否只对应一个Ribbon面板,或者说是可以绑定多个,我多次试验后,发现是vsto项目确实对应一个Ribbon,当你创建了Vsto项目你会发现你的项目中还没有Ribbon,你需要手动创建。如图下。

你以为这样你的项目中就生效了吗,你还需要将 Controlid 改为Custom,如果你想要第二个TabRibbon,你不需要在创建一个Ribbon,如果你创建了2个,那将都不显示,所有只能再创建一个Tab绑定一个 Controlid 。此时此刻,如图所示,已经达到了我们的效果。

感谢您阅读本篇文章,祝您工作顺利。
C#/Vsto中CustomTaskPanes和Ribbon的使用方法的更多相关文章
- VSTO中Word的Range复制方式
VSTO中Word的Range复制方式 前言 VSTO是一套用于创建自定义Office应用程序的Visual Studio工具包,通过Interop提供的增强Office对象,可以对Word文档进行编 ...
- VSTO中Word转换Range为Image的方法
VSTO中Word转换Range为Image的方法 前言 VSTO是一套用于创建自定义Office应用程序的Visual Studio工具包,通过Interop提供的增强Office对象,可以对Wor ...
- VSTO中Word的查找方式
VSTO中Word的查找方式 前言 使用C#在VSTO开发Word插件的过程,经常需要对文档中的内容进行查找和替换.在Word中进行文本的查找替换,和一般对纯文本的查找替换却不太一样.因为Word文档 ...
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
- 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法
Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...
- MSCRM 2011中过滤化查询的实现方法和禁用选择视图
MS CRM 2011中过滤化查询的实现方法 使用过滤化查询,可以实现根据表单上的其他信息作为搜索条件,限制Lookup查找框中的搜索结果数量的目的. 在讲解具体的实现方法之前,先设定一个应用场景: ...
- C#中实现并发的几种方法的性能测试
C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...
- .Net中的AOP系列之《方法执行前后——边界切面》
返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...
- VS2012中丢失ArcGIS模板的解决方法
VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...
随机推荐
- 鸟哥的Linux学习笔记-bash
1. /bin/bash是linux预设的shell,也是Linux发行版的标准shell,它兼容sh,可以看作是sh的功能加强. 2. bash具有命令记录功能,在bash中通过上下键就可以翻找之前 ...
- 让 iOS 设备 “说出” 你想说的话!! #DF
之前以为很难,其实超简单的~! 几行代码就可以搞定 ^_^ NSString *speech = @"今天天气好晴朗,处处好风光!好风光!"; // 你想设备读出来的文字 AVS ...
- 隐藏键盘的N种方法
---Created by luo.h 显示键盘 [textField becomeFirstResponder]; 隐藏键盘 @interface ViewController ()<UITe ...
- Kubernetes家族容器小管家Pod在线答疑?
Kubernetes家族容器小管家Pod在线答疑 不知道学习k8s的小伙伴们有没有跟我一样的疑问? k8s为什么不是直接运行容器,而是让Pod介入? Pod又是什么?为什么在应用容器化如此普遍的情况下 ...
- Spring Boot-开启第一步
Spring Boot开发的目的是为了简化Spring应用的开发,使用Spring Boot可以零配置开启一个Spring应用.这得益于Spring Boot中的自动配置组件,如果开发者觉得默认的配置 ...
- Solution -「SP 6779」GSS7
\(\mathcal{Description}\) 给定一棵 \(n\) 个点的带点权树,\(q\) 次操作: 路径点权赋值. 询问路径最大子段和(可以为空). \(n,q\le10^5\). ...
- git忽略文件提交 .gitignore
Git 忽略规则 详细的忽略规则可以参考官方英文文档 Git 忽略规则优先级 在 .gitingore 文件中,每一行指定一个忽略规则,Git 检查忽略规则的时候有多个来源,它的优先级如下(由高到低) ...
- Docker 镜像 层结构理解
镜像到底是什么.镜像的层结构又是什么 通过docker history命令进行分析,镜像是一种其他镜像+文件+命令的组合. 这些镜像的加载.文件导入创建.命令是存在顺序关系的,所以也引出了层的概念. ...
- Redis 中 String 类型的内存开销比较大
使用 String 类型内存开销大 1.简单动态字符串 2.RedisObject 3.全局哈希表 使用 Hash 来存储 总结 参考 使用 String 类型内存开销大 如果我们有大量的数据需要来保 ...
- Python-Flask框架之"图书管理系统"项目,附详解源代码及页面效果截图
该图书管理系统要实现的功能如下: 1. 可以通过添加窗口添加书籍或作者,如果要添加的作者和书籍已存在于书架上, 则给出相应的提示: 2. 如果要添加的作者存在,而要添加的书籍书架上没有,则将该书籍添加 ...