我们从用户中收到一些反馈,希望能够在多个Office应用程序中重用同一个可视化设计器设计的功能区。这个想法是非常有用的,如果同样的自定义选项卡能用于每一个应用程序,那为什么还要给每个不同的Office项目创建相同的功能区呢?
所以我四处询问,寻找一个解决方案。我找到了一个曾经参与开发VSTO功能区设计器的程序员,他向我展示了如何在多个Office项目中共享自定义功能区。
首先,在VSTO解决方案添加一个功能区项;然后,将功能区项的代码文件复制到一个类库项目中;最后,在其他VSTO项目添加对这个类库项目(或者生成的程序集)的引用。恩,这很简单,不是吗?以下是详细步骤:
创建功能区
- 在Visual Studio 2008中创建一个Office 2007的项目,Excel、Outlook、PowerPoint或者Word任选。为了下文叙述方便,我们采用C#语言来创建项目,这个项目名称叫做RibbonStarterProject。
- 添加一个功能区(可视化设计器)项到项目中,就采用默认的名称“Ribbon1”。
- 保存并且关闭项目。
创建类库工程
- 在Visual Studio中创建一个类库(Class Library)项目,项目的名称叫做SharedRibbonLibrary。
- 在项目中添加对程序集 Microsoft.Office.Tools.Common.V9.0 的引用。
- 在Visual Studio的项目(Project)菜单中,点击添加已存在的项(Add Existing Item...)。
- 在添加已存在的项对话框中,导航到"RibbonStarterProject"项目的文件夹,选中Ribbon1.cs文件,单击添加(Add)按钮。Ribbon1.cs就被复制到当前项目的文件夹下,同时在解决方案资源管理器(Solution Explorer)里项目节点下会增加对应的节点。
- 双击Ribbon1.cs打开功能区设计器。(译者注:如果只能打开代码编辑器,请检查第二步添加引用的程序集是否正确。)
- 从工具箱(Toolbox)的Office功能区控件(Office Ribbon Controls)选项卡中,将一个按钮拖到功能区设计器中的group1。
- 单击button1将其选中。
- 在属性窗口中,将访问控制符(Modifier)设置为公共的(Public)。
注意:在默认的情况下,用户添加到功能区的控件都是内部的(Internal),即只允许同一个程序集的代码可以访问。然而,当需要共享功能区和里面的控件,就不得不通过对程序集之间的引用来实现,因此,为了让其他程序集的代码可以访问控件,访问控制符(Modifier)就必须设置为公共的。后面马上就会看到这样做的好处。
- 右键单击功能区设计器,然后点击属性。
- 在属性窗口中,点击功能区类型(RibbonType)属性,然后选择对应的应用程序功能区ID(译者注:Outlook有多个功能区ID,对应不同的邮件类,可以分别定制是否需要显示功能区)。关于这个属性的更多信息,请参考MSDN上的RibbonType属性。
- 在解决方案资源管理器中,右键单击Ribbon1.cs,然后单击显示代码(View Code)。
- 将类的命名空间修改为“SharedRibbonLibrary”。
- 对Ribbon1.designer.cs文件重复上11和12步。
- 编译并且保存SharedRibbonLibrary项目。现在在其他的VSTO项目中就可以使用生成的程序集来增加功能区的支持。
使用自定义功能区
- 创建一个Office 2007项目,Excel、Outlook、PowerPoint和Word任选。
- 添加对SharedRibbonLibrary程序集的引用。
- 添加以下代码到新项目的ThisAddin、ThisWorkbook或者ThisDocument类(取决于具体的VSTO项目)里面。
这段代码重载了CreateRibbonExtensibilityObject方法,并将功能区对象返回给Office应用程序。

Code
protected override Microsoft.Office.Core.IRibbonExtensibility
CreateRibbonExtensibilityObject()
{
return new Microsoft.Office.Tools.Ribbon.RibbonManager(
new Microsoft.Office.Tools.Ribbon.OfficeRibbon[] { new
SharedRibbonLibrary.Ribbon1() });
}
- 添加一个新类到项目中,使用默认的名称"Class1.cs"。
- 用以下代码替换Class1文件中的代码:

Code
partial class ThisRibbonCollection : Microsoft.Office.Tools.Ribbon.RibbonReadOnlyCollection
{
internal SharedRibbonLibrary.Ribbon1 Ribbon1
{
get { return this.GetRibbon<SharedRibbonLibrary.Ribbon1>(); }
}
}
好了,都完成了,现在已经可以使用代码来访问功能区和功能区中的按钮了。让我们再尝试怎么处理一个事件。
处理按钮点击事件
- 在项目的startup事件处理函数中添加如下代码:

Code
Globals.Ribbons.Ribbon1.button1.Click += new EventHandler<Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs>(button1_Click);
- 在项目中继续添加按钮的事件处理函数:

Code
void button1_Click(object sender, Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs e)
{
System.Windows.Forms.MessageBox.Show("I can handle events!");
}
- F5运行项目。
- 当Office应用程序打开以后,单击“外接程序”(Add-ins)选项卡,单击自定义按钮,就能看到“I can handle events”消息框弹出。
posted @ 2008-10-22 15:36 Stony Wang 阅读(515) 评论(0)
编辑