引言:下图类似“剪帖画”的是几个Excel中的命令栏。其中“文档操作”是可自由定制的,文档操作面板无法直接使用(不可见),在本图里可以看到,是因为我写代码在上面添加了一个TextBox控件。
命令栏是Commandbars集合成员,属于Commandbar类型。使用VBA写段代码罗列出所有的命令栏:
1 Sub ShowCommandbar() 2 Dim bars As Office.CommandBars 3 Set bars = Application.CommandBars 4 Dim bar As Office.CommandBar 5 For Each bar In bars 6 i = i + 1 7 Cells(i, 1) = bar.Name ‘名称 8 Cells(i, 2) = bar.NameLocal ‘本地化名称 9 Cells(i, 3) = bar.Index ‘索引 10 Next 11 End Sub
其中和上几个命令栏有对应关系的摘录如下。
Task Pane是要定制的目标,无法直接给它添加我们想要的控件,但可以把控件添加在ActionsPane对象上。
关系示意图:
这个关系模型意味着:要添加控件就要找ActionsPane,要控制这些元素整体在工作表上的位置就要依赖Task Pane。
没错,一定要记住Task Pane就是一个命令栏(Commanbar)。不过要给这个命令栏添加控件,就要借道ActionsPane。
1 public sealed partial class ThisWorkbook : Microsoft.Office.Tools.Excel.WorkbookBase { 2 internal Microsoft.Office.Tools.ActionsPane ActionsPane; 3 //省略部分代码 4 private void InitializeControls() { 5 this.ActionsPane = Globals.Factory.CreateActionsPane(null, null, "ActionsPane", "ActionsPane", this); 6 } 7 //省略部分代码 8 }
ActionsPane对象定义在ThisWorkbook.Designer.cs中,在Thisworkbook类里可以直接调用:
1 using Office = Microsoft.Office.Core; 2 3 private void ThisWorkbook_Startup(object sender, System.EventArgs e) 4 { 5 //给ActionsPane添加控件(添加控件后,任务窗格在工作簿打开时就会默认显示出来) 6 TextBox box=new TextBox() ; 7 ActionsPane.Controls.Add(box ); 8 //取消停靠 9 box.Dock = DockStyle.None; 10 //设置锚定 11 box.Anchor = AnchorStyles.Top; 12 //文本框的宽度 13 box.Width = 100; 14 //设置Task Pane的显示位置 15 Office.CommandBar bar = Globals.ThisWorkbook.Application.CommandBars[125]; 16 bar.Position = Office.MsoBarPosition.msoBarLeft; 17 }
使用编程方式可以动态的给ActionsPane添加控件,但有时也需要使用设计好的图面,ActionsPane没有设计图面,此时可以借用ActionsPaneControl或者UserControl,其中后者还可以充当程序级项目操作窗格的设计器。
右键点解决方案,添加用户控件:
UserContrl是控件容器,将控件拖动到设计图面上:
然后使用代码,将控件添加到ActionsPane即完成任务窗格的定制:
1 private void ThisWorkbook_Startup(object sender, System.EventArgs e) 2 { 3 //给ActionsPane添加控件 4 ActionsPane.Controls.Add(new UserControl1()); 5 //添加控件后,可见性自动为true,下面一句是不需要的 6 //ActionsPane.Visible = true; 7 }
工作簿启动后,在视图选项卡中可以找到“文档操作”按钮,控制其显示和隐藏(默认情况下工作簿该按钮不可见)。
最后要指出个人的理解(不确定是否正确):
文档级任务窗格是"单例"的——即任何时候拿到的都是同一个任务窗格。即使可以动态的给它添加或减少控件,即使可以根据需要让窗格中控件可见或不可见。但这些所有操作的对象,都是同一个Task Pane,同一个Commandbar上的同一个ActionsPane。
这一点和程序级Addin项目中的任务窗格是不同的。