首页 > 单独文章 > 正文

Office2007 用户界面(UI)的定制(八)

时间:2008-04-19 08:58:05 作者:officeba 【认证】

当创建COM加载项时,通常需要一种用户与加载项相交互的方式。在Office以前的版本中,使用commandbars对象模型通过添加菜单项或工具栏按钮到应用程序中来完成这项操作。在Office 2007版中,大多数情况下自定义应用程序将继续在Fluent UI中工作而无需修改。然而,对commandbars对象模型的修改或者其它任何修改菜单和工具栏的技术,例如WordBasic或XLM,将在“加载项”选项卡中单独出现。这帮助用户查找需要处理的控件和以前使用的加载项。
要在Fluent UI中对项目进行修改,可以使用已经介绍的技术和代码。对于已存在的修改菜单结构的加载项,将在加载项选项卡中出现命令。
动态更新Fluent UI
返回控件属性的回调(例如库控件的getItemCount回调)通常仅在Fluent UI初始化时调用,除非强制该控件重新初始化。可以通过在代码中存储对Ribbon的引用来强制该操作发生,然后调用Ribbon的方法来使单个的控件或整个Ribbon无效。要实现该操作,必须在<customUI>元素中添加onLoad属性,指定回调过程。当RibbonX标记文件成功地装载时,调用onLoad回调一次。回调过程接受IRibbonUI对象作为参数,代码可以缓存该引用为以后使用。IRibbonUI类提供能使单独的控件或整个Ribbon无效的方法。
为了缓存IRibbonUI对象,以便可以在运行时更新控件,则可添加如下代码:
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“
  onLoad=”ribbonLoaded”>
在代码中(在文档里的VBA代码,或者在加载项中可能是Visual Basic代码或C#代码),添加一个过程如下:
IRibbonUI myRibbon;

public void ribbonLoaded(IRibbonUI ribbon)
{
  myRibbon = ribbon;
}
IRibbonUI接口公开下面的方法。
表:IRibbonUI接口的方法

方法 动作 描述
Invalidate() 回调 导致所有自定义控件重新初始化
InvalidateControl(sting controlID) 回调 导致指定的控件重新初始化

装载图像
<customUI>元素的loadImage属性能使用户指定可以装载所有图像的回调。创建回调过程之后,Office调作回调过程并为每个装载图像的控件传递图像属性字符串。不需要执行getImage回调多次,例如需要图像的每个控件都一次。某定制可能包括下面的标记:
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“
  loadImage=”GetImage”>
<!– Later in the markup –>
   <button id=”myButton” image=”mypic.jpg” />
要提供按钮的图像,Office调用GetImage函数,传递参数“mypic.jpg”并随后接受IPictureDisp对象。通过使用该技术,可以编写返回定制需要的所有图像的单独的回调过程,而不需要必须编写每个单个控件的getImage回调。注意,在调用Ribbon的Invalidate方法或InvalidateControl方法时,不需再调用loadImage回调。对需要在运行时动态改变图像的控件,使用getImage回调。
例如,使用下面示例中的代码提供定制的图像。getImage回调方法必须返回stdole.IPictureDisp类型,因此通常需要转换图像为这种类型。在执行这些转换,可以使用下面的PictureConverter类,从AxHost类中继承。
Friend Class PictureConverter
  Inherits AxHost  Private Sub New()
    MyBase.New(String.Empty)
  End Sub

  Public Shared Function ImageToPictureDisp( _
    ByVal image As Image) As stdole.IPictureDisp
    Return CType(GetIPictureDispFromPicture(image), _
      stdole.IPictureDisp)
  End Function

  Public Shared Function IconToPictureDisp( _
    ByVal icon As Icon) As stdole.IPictureDisp
    Return ImageToPictureDisp(icon.ToBitmap())
  End Function

  Public Shared Function PictureDispToImage( _
    ByVal picture As stdole.IPictureDisp) As Image
    Return GetPictureFromIPicture(picture)
  End Function
End Class
接下来,回调过程可以如下所示,假设已添加名为MyIcon的图标到项目资源中。
Public Function GetImage( _
  ByVal imageName As String) As stdole.IPictureDisp
  Return PictureConverter.IconToPictureDisp(My.Resources.MyIcon)
End Function
注:项目必须有一个对stdole组件的引用去运行这段代码。在通过使用VSTO创建项目时,将自动包括该引用。
小结
在以前的Office版本中定制UI意味着为每个共享的外接程序的应用程序创建COM加载项或DLL文件。相反,Ribbon功能使用了基于文本、公布的XML标记,简化了创建和定制Ribbon。使用一些XML行,可以为用户创建合适的界面。因为XML标记包含在单个的文件中,当需要变化时修改界面更简单。也可以通过放置命令在用户更容易找到的地方,来提高效率。修改Ribbon在Office应用程序中的通用的,这减少了学习修改每个应用程序界面的时间。


相关文章

同类最新