使用应用程序模式重新配置功能区

Windows 功能区框架支持根据应用程序的状态在运行时动态重新配置和公开功能区 UI 的核心元素, (也称为上下文) 。 声明并与标记中的特定元素关联,应用程序支持的各种状态称为应用程序模式。

简介

应用程序模式由控件的逻辑组组成,这些控件在功能区 UI 中公开某些核心应用程序功能。 应用程序通过调用框架方法 IUIFramework::SetModes 动态启用或禁用这些模式,这将打开或关闭一个或多个应用程序模式的可见性。

上下文用户界面

功能区框架通过合并动态控件来提供丰富的用户体验,这些控件可无缝响应用户交互和应用程序上下文。 此丰富的上下文 UI 通过以下机制的组合提供:

  • 库 - 基于集合的控件,支持对其项集合进行动态操作。
  • 上下文选项卡 - 功能区选项卡,其可见性由工作区上下文中的更改决定,例如在文档中选择图像。
  • 应用程序模式 - 依赖于应用程序上下文的核心应用程序功能。

在某些方面,应用程序模式在功能上类似于上下文选项卡。 但是,基本区别在于每个对象的意图和范围。

激活上下文控件以响应应用程序中上下文的更改。 例如,在 Windows 7 Microsoft 画图中,当用户将文本区域插入工作区时,将显示包含文本相关命令组的上下文选项卡。 此上下文选项卡不包含应用程序的核心命令,并且仅在 UI 中公开,因为 应用程序中的上下文 已更改。 应用程序的核心功能 (图像编辑命令) 仍然相关且可供用户使用,即使上下文选项卡可见也是如此。

应用程序模式与上下文控件的不同之处在于,它们重新配置功能以响应运行应用程序的上下文中的更改。 应用程序模式处于更高的抽象级别;它们提供了一种方法来重新配置应用程序的核心功能,而不是暂时公开不是 UI 核心组件的功能。 例如,在 Windows 7 的 Microsoft 画图中,调用“打印预览”命令时,应用程序模式下会出现切换。 当Microsoft 画图切换到“打印预览”时,应用程序运行的上下文将从编辑更改为预览。 因此,应用程序的核心功能会更改,直到取消 打印预览 ,应用程序再次进入编辑上下文。

简单的应用程序模式方案

以下方案演示了如何在名为 RibbonApp 的应用程序中使用应用程序模式来公开核心功能的离散方面。

RibbonApp 中定义了两种应用程序模式:

  • 简单 模式在整个功能区 UI 中公开基本命令。 无论哪个应用程序模式处于活动状态,这些命令都会随时显示。
  • 高级 模式公开适用于应用程序专家用户的复杂命令。 除了简单的命令之外,这些高级命令还在整个功能区 UI 中显示。

默认情况下,RibbonApp 设置为在简单模式下打开,新手用户所需的命令显示在“应用程序菜单”和“主页”选项卡中。以下屏幕截图显示了简单模式下的 RibbonApp 应用程序菜单“主页”选项卡,其中突出显示了模式控件。

显示简单应用程序模式的选项卡的屏幕截图。 显示简单应用程序模式的应用程序菜单的屏幕截图。

虽然这些命令对于新手用户来说可能已足够,但 RibbonApp 还通过高级模式支持专家用户,当通过单击应用程序菜单中的“切换到高级模式”按钮激活时,会显示其他核心功能。

通过将标记中的各种元素绑定到可根据需要打开和关闭的离散应用程序模式,可以轻松实现此方案。 以下屏幕截图显示了“高级”模式下的 RibbonApp 应用程序菜单和“主页”选项卡,其中突出显示了模式控件。

显示高级应用程序模式的选项卡的屏幕截图。 显示高级应用程序模式的应用程序菜单的屏幕截图。

实现应用程序模式

本部分概述了实现功能区框架应用程序模式通常需要的三个步骤。 RibbonApp 用于提供每个步骤的示例。

确定模式

应用程序中的每个模式都应表示一组逻辑功能,该功能取决于应用程序能够运行的上下文。 例如,如果应用程序显示仅在检测到网络连接时才相关的控件,则这些控件在可能证明创建 网络 模式的合理性的网络上下文中运行。

RibbonApp 有两个可在任意给定时间处于活动状态的上下文: 简单高级。 因此,RibbonApp 需要两种模式: 简单高级

将控件分配给应用程序模式

标识应用程序模式后,通过在标记中为支持应用程序模式的控件元素声明 ApplicationModes 属性,将每个功能区控件分配到一个模式。

功能区视图允许在以下控件元素上指定模式:

在功能区框架中,这些控件元素称为模式控件。 仅当它们绑定到的模式在 UI 中处于活动状态时,它们才会显示。

模式控件中包含的控件元素继承应用程序模式行为。 例如,如果将 模式控件分配给 高级 模式,而 高级 模式未处于活动状态,则该 及其中的任何控件(模式或其他)都将在功能区 UI 中不可见。

使用 ApplicationModes 属性时,模式以 1:N (一对多) 关系分配给模式控件,其中单个模式控件可以与多个模式相关联。

功能区框架以数字表示模式,从 0 到 31,模式 0 被视为在功能区应用程序启动时自动激活的默认模式。 任何未指定 ApplicationModes 属性的模式控件都被视为默认模式的成员。

在 RibbonApp 中, “简单 ”是默认模式,仅当用户启动高级模式时才会显示 高级 模式功能。

以下示例演示 RibbonApp 所需的标记。

<Application.Views>
  <Ribbon>

    <!--Application Menu-->
    <Ribbon.ApplicationMenu>
      <ApplicationMenu CommandName='cmdAppMenu'>                    
        <MenuGroup>
          <Button CommandName='cmdSave'/>                        
          <Button CommandName='cmdExportMetadata' ApplicationModes='1'/>                   
        </MenuGroup>              
        <MenuGroup>
          <Button CommandName='cmdSwitchModes' ApplicationModes ='0,1'/>
          <Button CommandName='cmdExit'/>
        </MenuGroup>
      </ApplicationMenu>
    </Ribbon.ApplicationMenu>
            
    <!--Tabs-->
    <Ribbon.Tabs>
      <!--Home Tab-->
      <Tab CommandName='cmdHomeTab'>
                    
        <!--Scaling Policy for Home tab-->
        <Tab.ScalingPolicy>
          <ScalingPolicy>
            <ScalingPolicy.IdealSizes>
              <Scale Group='cmdSimpleControlsGroup' Size='Medium'/>                                
            </ScalingPolicy.IdealSizes>                     
          </ScalingPolicy>
        </Tab.ScalingPolicy>     
                    
        <!--Simple Controls Group-->
        <Group CommandName='cmdSimpleControlsGroup' SizeDefinition='ThreeButtons-OneBigAndTwoSmall'>                        
          <Button CommandName="cmdPaste" />
          <Button CommandName='cmdCut'/>                        
          <Button CommandName='cmdCopy'/>                        
        </Group>
      </Tab>
                
      <!--Advanced Tab-->
      <Tab CommandName='cmdAdvancedTab' ApplicationModes='1'>
        <!--Advanced Controls Group-->
        <Group CommandName='cmdMetadataGroup' ApplicationModes='1' SizeDefinition='TwoButtons'>
          <Button CommandName='cmdEditMetadata' />
          <Button CommandName='cmdCheckErrors' />
        </Group>
      </Tab>
    </Ribbon.Tabs>                   
                             
  </Ribbon>         
</Application.Views>

此示例演示了以下内容:

  • 不需要显式声明默认模式 0。 由于未指定 ApplicationModes 属性的模式控件会自动绑定到 RibbonApp 示例中的模式 0 (简单 模式) ,因此无需显式声明默认模式控件的属性。
  • 控件可以绑定到多个模式。 对于 RibbonApp,简单模式控件ApplicationModes 属性的唯一需要是cmdSwitchModes按钮 ,因为它是简单模式和高级模式的一部分。 如果任一模式处于活动状态,则此控件将显示在 应用程序菜单中
  • 模式控件不从其父级继承。 RibbonApp 的“ 高级 ”选项卡包含 元数据 组;这两个模式控件都分配给模式 1 (高级 模式) 。 将“ 高级 ”选项卡分配到模式 1 不会自动将子控件(如 元数据组) 分配到模式 1。 这允许在运行时独立启用或禁用选项卡内的任何组。
  • 非模式控件仍可以依赖于模式开关。 RibbonApp 的 “编辑元数据 ”和“ 检查错误” 按钮适用于高级用户,仅在用户切换到 高级 模式时可用。 未托管在 应用程序菜单中 的按钮控件是非模式的;但是,由于这些按钮托管在 元数据 组) (模式控件内,因此当组可见时,它们可见。 因此,当激活高级模式并在功能区 UI 中公开 “元数据” 组时,将显示这些按钮。

运行时切换模式

在标记中定义模式后,可以轻松启用或禁用它们以响应上下文事件。 如前所述,功能区应用程序始终以默认模式 0 启动。 初始化应用程序且模式 0 处于活动状态后,可以通过调用 IUIFramework::SetModes 函数更改活动模式集。 此函数采用 32 位整数作为应处于活动状态的模式的按位表示形式;最小有效位表示模式 0,最高有效位表示模式 31。 如果位设置为零,则模式在功能区 UI 中不处于活动状态。

在 RibbonApp 中,当用户启用 高级 模式时,高级命令与简单命令一起显示。 “ 切换到高级模式 ”按钮的命令处理程序调用 IUIFramework::SetModes ,以便在 UI 中将模式 0 (简单) 和 1 (高级) 设置为活动状态。 以下示例是此函数调用 的 RibbonApp 代码:

const int SIMPLE_MODE = 0;
const int ADVANCED_MODE = 1;
pFramework->SetModes( UI_MAKEAPPMODE(SIMPLE_MODE) | UI_MAKEAPPMODE(ADVANCED_MODE) );

注意

功能区框架UI_MAKEAPPMODE宏简化了正确设置这些位的任务,为调用 IUIFramework::SetModes 做准备。

 

此示例演示了以下内容:

  • 使用 UI_MAKEAPPMODE 宏生成模式集。
  • 模式是显式和原子设置的。 传递给 IUIFramework::SetModes 的 整数值表示函数返回后将处于活动状态的模式。 尽管简单模式以前处于活动状态,但 IUIFramework::SetModes 必须指示在激活高级模式时简单模式保持活动状态。
  • 可以删除默认模式。 尽管在 RibbonApp 中,从不删除默认模式 (模式 0) ,但可以通过以下调用将其删除: g_pFramework->SetModes(UI_MAKEAPPMODE(ADVANCED_MODE)),仅公开 UI 中的高级命令。

注意

重新配置应用程序的模式时,功能区将尝试在 UI 中保留以前选择的选项卡。 如果新模式集不再包含调用前选择的选项卡,功能区将在其布局中选择最靠近 应用程序菜单的选项卡。 此选项卡旨在包含与用户最相关的命令。 有关详细信息,请参阅 功能区用户体验指南

 

备注

功能区必须始终保持至少一个活动模式。 如果应用程序尝试通过调用模式值为 0 的 IUIFramework::SetModes 来停用所有模式,则返回E_FAIL,并且活动模式集保持不变。

框架要求功能区 UI 中在任何时候都至少有一个选项卡。 因此,默认模式 (模式 0) 以及每个模式切换后,必须至少公开一个选项卡。

并非所有功能区 UI 区域都会受到应用程序模式的影响。 例如,如果禁用模式会导致之前添加到 快速访问工具栏的功能区中的按钮消失,则这些按钮将保留在快速访问工具栏中,允许用户执行绑定到按钮的命令。 一般情况下,如果 Command 属于一个或多个非活动模式,则还应通过将 UI_PKEY_Enabled 属性设置为 0 (VARIANT_FALSE) 来禁用该命令。

功能区用户体验指南

显示上下文选项卡