任务窗格 (task pane) 是 VSTO 提供的主要界面之一,运行时任务窗格的界面看起来如下。本文假设我们要实现一个方便自己进行拷贝和粘贴的多重剪贴板,实现将单元格中需要反复使用的文本加载到 ListBox,并且能够拷贝到选中的单元格中。

界面设计

任务窗格本质上是一个 User Control,在工程中新建一个 user control:


将 User Control 命名为 ClipBoardPro,设计界面如下:

在 ClipboardPro 类代码中,编写四个按钮单击事件的代码:

using Microsoft.Office.Interop.Excel;
using System;
using System.Windows.Forms;
using WinForm = System.Windows.Forms;namespace VSTODemo
{public partial class ClipBoardPro : UserControl{public ClipBoardPro(){InitializeComponent();}private void btnAdd_Click(object sender, EventArgs e){string content = ThisAddIn.ExcelApp.ActiveCell.Value;if (lstContent.FindStringExact(content) == WinForm.ListBox.NoMatches) {lstContent.Items.Add(content);}}private void btnCopy_Click(object sender, EventArgs e){if (lstContent.SelectedIndex != -1) {foreach(Range cell in ThisAddIn.ExcelApp.Selection) {cell.Value = lstContent.Text;}                }}private void btnClearAll_Click(object sender, EventArgs e) {lstContent.Items.Clear();}private void btnClearCurrent_Click(object sender, EventArgs e) {lstContent.Items.RemoveAt(lstContent.SelectedIndex);}}
}

加载任务窗格

为了实现任务窗格的复用,创建一个静态类:

namespace VSTODemo
{public static class TaskPaneShared{public static Microsoft.Office.Tools.CustomTaskPane taskPane;}
}

在 ThisAddIn 的 ThisAddIn_Startup 事件中加载:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{ExcelApp = Globals.ThisAddIn.Application;// 初始化TaskPaneClipBoardPro clipboard = new ClipBoardPro();TaskPaneShared.taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(clipboard, "剪贴板");TaskPaneShared.taskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionRight;TaskPaneShared.taskPane.DockPositionRestrict = MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;TaskPaneShared.taskPane.Width = 500;// VisibleChange EventTaskPaneShared.taskPane.VisibleChanged += new System.EventHandler(taskpane_VisibleChanged);
}

默认情况下,Task Pane 位于界面的右侧停靠,允许通过 DockPosition 属性设置停靠在左右、上下或者浮动。DockPostionRestrict 属性设置是否允许用户改变停靠的位置。

显示和隐藏任务窗格

在 Ribbon1 中新建一个 checkbox,界面如下:

编写 cbShowTaskPanel_Click 事件:

private void cbShowTaskPanel_Click(object sender, RibbonControlEventArgs e)
{TaskPaneShared.taskPane.Visible = cbShowTaskPanel.Checked;
}

因为用户也可以手工关闭任务窗格(其实是隐藏),为了保持界面同步,在 TaskPane 的 visibleChange 事件中编写如下代码:

源代码

06-Custom Task Pane - 码云

VSTO 系列(06)-自定义任务窗格相关推荐

  1. VSTO Office二次开发对PPT自定义任务窗格测试

    上篇文章对VSTO Office二次开发操作PPT功能做了简单测试,主要是如何创建一个外接程序并在新建PPT幻灯片时添加自定义文本信息.如何简单自定义任务窗格.如何添加可视化功能区的简单介绍,应该对于 ...

  2. RNN 循环神经网络系列 5: 自定义单元

    原文地址:RECURRENT NEURAL NETWORK (RNN) – PART 5: CUSTOM CELLS 原文作者:GokuMohandas 译文出自:掘金翻译计划 本文永久链接:gith ...

  3. 数据可视化系列-06数据分析工具QuickBI

    文章目录 数据可视化系列-06数据分析工具QuickBI 一文介绍QuickBI Quick BI 的基本对象 快速入门 Quick BI产品架构界面说明 菜单栏 我的看板 工作台首页 通过仪表板分析 ...

  4. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  5. Docker系列06—基于容器制作镜像并上传到Docker Registry

    Docker系列06-基于容器制作镜像并上传到Docker Registry 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容 ...

  6. SharePoint 2013 图文开发系列之自定义字段

    原文:SharePoint 2013 图文开发系列之自定义字段 SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应 ...

  7. vSphere 7 With K8s系列06:创建命名空间

    vSphere 7 With K8s系列06:创建命名空间 原创 李严省 虚实之路 9月24日 收录于话题 #vSphere with K8s 9个 上一篇文章已经介绍了如何开启vSphere7 wi ...

  8. SpringBoot 2.0 系列003 -- 自定义Parent

    为什么80%的码农都做不了架构师?>>>    SpringBoot 2.0 系列003 --自定义Parent 默认我们使用SpringBoot的方式是通过SB的parent项目的 ...

  9. 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别...

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  10. 如何在Outlook中创建自定义导航窗格

    Outlook's navigation pane lets you navigate to different folders, mailboxes, and groups. However, it ...

最新文章

  1. Android PullToZoomListView实现放大回弹效果
  2. Android中的各种Adapter
  3. Hive 0.13.1 和HBase 0.98.6.1整合
  4. 手机格斗网游该如何避免延迟?
  5. No plugin found for prefix ‘compile‘ in the current project
  6. Spring4:没有默认构造函数的基于CGLIB的代理类
  7. Linux中文档去掉windows文本的多余的回车符(^M)
  8. jdbc预编译插入数据操作
  9. Win7下用的XP虚拟机
  10. java-后端八股文
  11. python内置函数( )可以返回列表长度_python内置函数总结
  12. 网络摄像机如何安装拾音器?进行同步录音
  13. 【深度学习之美】全面连接困何处,卷积网络见解深(入门系列之九)
  14. 剪刀石头布(自留底)01
  15. Ubuntu16.04下NVIDIA显卡驱动安装(华硕飞行堡垒7代,1660ti)
  16. 机器学习发展历史(符号学习、统计机器学习、深度学习)
  17. 如何在程序中创建快捷方式
  18. 浏览器控制台过滤无用的提示和报错
  19. Beehive:用于修复分布式存储系统中多个故障的纠删码
  20. asp动态网页设计选用服务器,ASP动态网页设计

热门文章

  1. Hadoop基本组成
  2. 论文笔记翻译——Enhanced LSTM for Natural Language Inference(ESIM)
  3. 基于php022公司企业网站设计-计算机毕业设计
  4. 流浪大师善始者众善终者寡_流浪者–适合每个开发人员的瑞士军刀
  5. Office 2003 sp3(CVE-2012-0158)漏洞分析报告
  6. 魅族16sPro更新体验版Flyme8,手机桌面更丰富,新增逆光自拍模式
  7. Live Server 正常启用 但是网页不更新 解决方法
  8. Knockout绑定语法
  9. CentOS下搭建LAMP
  10. 【bean的生命周期】--- BeanDefinition和BeanFactoryPostProcessor简介