在工作中有一个需求,需要添加工作区选项卡,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的使用方法的更多相关文章

  1. VSTO中Word的Range复制方式

    VSTO中Word的Range复制方式 前言 VSTO是一套用于创建自定义Office应用程序的Visual Studio工具包,通过Interop提供的增强Office对象,可以对Word文档进行编 ...

  2. VSTO中Word转换Range为Image的方法

    VSTO中Word转换Range为Image的方法 前言 VSTO是一套用于创建自定义Office应用程序的Visual Studio工具包,通过Interop提供的增强Office对象,可以对Wor ...

  3. VSTO中Word的查找方式

    VSTO中Word的查找方式 前言 使用C#在VSTO开发Word插件的过程,经常需要对文档中的内容进行查找和替换.在Word中进行文本的查找替换,和一般对纯文本的查找替换却不太一样.因为Word文档 ...

  4. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  5. 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法

    Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...

  6. MSCRM 2011中过滤化查询的实现方法和禁用选择视图

    MS CRM 2011中过滤化查询的实现方法 使用过滤化查询,可以实现根据表单上的其他信息作为搜索条件,限制Lookup查找框中的搜索结果数量的目的. 在讲解具体的实现方法之前,先设定一个应用场景: ...

  7. C#中实现并发的几种方法的性能测试

    C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...

  8. .Net中的AOP系列之《方法执行前后——边界切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...

  9. VS2012中丢失ArcGIS模板的解决方法

    VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...

随机推荐

  1. 关于linux shell编程,alias rm='cp $@ ~/backup; rm $@'

    书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp $@ ~/backup; ...

  2. Mac 屏幕录制Gif 制作 By-胡罗

    一.视频录制 1)使用Mac系统自带的QuickTime进行屏幕录像 手动打开(如下图) 详细 Mac 基础教程:如何使用 Mac 系统原生的屏幕录制功能 相关快捷键 option+command+n ...

  3. C#后台去除HTML标签

    public string NoHTML(string Htmlstring) { //删除脚本 Htmlstring = Regex.Replace(Htmlstring, @"<s ...

  4. docker基础——4.网络待补

    docker network ls bridge:NAT桥 host:共用宿主机namespace的UTS.IPC.Network none:只有lo,没有网卡 其他待补

  5. 快速搭建springboot工程

    一.创建SpringBoot的三种方式 在线创建: https://start.spring.io 在IntelliJ IDEA中选择Spring Initializr创建:或者在Eclipse中选择 ...

  6. 9、架构--动静分离、rewrite、HTTPS

    笔记 1.晨考 1.说明反向代理跟负载均衡有哪些区别? 2.负载均衡分配流量的几种方式? 1.轮询 2.权重 3.ip_hash 3.负载均衡部署BBS的步骤 2.昨日问题 3.今日内容 1.资源分离 ...

  7. Solution -「AGC 004E」「AT 2045」Salvage Robots

    \(\mathcal{Description}\)   Link.   有一个 \(n\times m\) 的网格.每个格子要么是空的,要么有一个机器人,要么是一个出口(仅有一个).每次可以命令所有机 ...

  8. IDEA 2021 没有Allow parallel run

    IDEA 2021 没有Allow parallel run 尝试运行多个客户端. 新版IDEA找不到Allow parallel run

  9. python的import语句

    1.import作用 import跟C/C++中的#include作用有点类似,都是为了调用定义在其他文件中的变量.函数或者类,但实现的区别很大. C/C++中如果a.cpp include了b.h那 ...

  10. ESXI系统从0搭建流程

    ESXI系统从0搭建流程 简单介绍 简单介绍:项目中使用到了这个系统,我自己不会搭建,但是请教别人之后自己成功搭建出来了此系统.所以在此记录一下搭建流程,希望能够帮助"零"小白. ...