アプリケーション モードを使用したリボンの再構成

Windows リボン フレームワークは、アプリケーションの状態 (コンテキストとも呼ばれます) に基づいて、実行時にリボン UI のコア要素の動的再構成と公開をサポートします。 マークアップ内の特定の要素に関連付けられた宣言され、アプリケーションでサポートされるさまざまな状態は、アプリケーション モードと呼ばれます。

はじめに

アプリケーション モードは、リボン UI で一部の主要なアプリケーション機能を公開するコントロールの論理グループで構成されます。 これらのモードは、フレームワーク メソッド IUIFramework::SetModes の呼び出しによってアプリケーションによって動的に有効または無効になり、1 つ以上のアプリケーション モードの可視性がオンまたはオフになります。

コンテキスト ユーザー インターフェイス

リボン フレームワークは、ユーザー操作とアプリケーション コンテキストにシームレスに応答する動的コントロールを組み込むことで、豊富なユーザー エクスペリエンスを提供します。 このリッチ コンテキスト UI は、次のメカニズムを組み合わせて提供されます。

  • ギャラリー - アイテム コレクションの動的な操作をサポートするコレクション ベースのコントロール。
  • コンテキスト タブ - ドキュメント内の画像の選択など、ワークスペース コンテキストの変更によって表示が決定されるリボン タブ。
  • アプリケーション モード - アプリケーション コンテキストに依存する主要なアプリケーション機能。

一部の点では、アプリケーション モードはコンテキスト タブと機能的に似ています。 ただし、根本的な違いは、それぞれの意図と範囲にあります。

コンテキスト コントロールは、アプリケーション内のコンテキストの変更に応じてアクティブ化されます。 たとえば、Windows 7 のMicrosoft ペイントでは、ユーザーがワークスペースにテキスト領域を挿入すると、テキスト関連コマンドのグループを含むコンテキスト タブが表示されます。 このコンテキスト タブには、アプリケーションのコア コマンドは含まれていません。アプリケーション のコンテキストが変更されたため、UI でのみ公開されます。 アプリケーションのコア機能 (画像編集コマンド) は、コンテキスト タブが表示されている場合でも、引き続き関連があり、ユーザーが使用できます。

アプリケーション モードは、アプリケーションが動作しているコンテキストの変化に応じて機能を再構成するという点で、コンテキスト コントロールとは異なります。 アプリケーション モードは、より高いレベルの抽象化に置きます。UI のコア コンポーネントではない機能を一時的に公開するのではなく、アプリケーションのコア機能を再構成する方法を提供します。 たとえば、Windows 7 のMicrosoft ペイントでは、印刷プレビュー コマンドが呼び出されたときにアプリケーション モードの切り替えが発生します。 Microsoft ペイント印刷プレビューに切り替わると、アプリケーションが動作しているコンテキストが編集からプレビューに変わります。 その結果、 印刷プレビュー が取り消され、アプリケーションが再び編集コンテキストに入るまで、アプリケーションのコア機能が変更されます。

単純なアプリケーション モードのシナリオ

次のシナリオでは、RibbonApp というアプリケーションでアプリケーション モードを使用して、コア機能の個別の側面を公開する方法を示します。

RibbonApp では、次の 2 つのアプリケーション モードが定義されています。

  • 簡易 モードでは、リボン UI 全体で基本的なコマンドが公開されます。 これらのコマンドは、アクティブなアプリケーション モードに関係なく、常に表示されます。
  • 高度な モードでは、アプリケーションのエキスパート ユーザー向けの複雑なコマンドが公開されます。 これらの高度なコマンドは、単純なコマンドに加えて、リボン UI 全体に表示されます。

既定では、RibbonApp は簡易モードで開くよう設定されており、初心者ユーザーが必要とするコマンドが [アプリケーション メニュー] タブと [ホーム] タブに表示されます。次のスクリーン ショットは、シンプル モードの RibbonApp アプリケーション メニュー[ホーム] タブを示し、モーダル コントロールを強調表示しています。

screen shot showing a tab for the simple application mode.screen shot showing the application menu for the simple application mode.

これらのコマンドは初心者ユーザーに十分かもしれませんが、RibbonApp は高度なモードを使用してエキスパート ユーザーをサポートします。また、アプリケーション メニュー[詳細モードに切り替える] ボタンをクリックしてアクティブ化すると、追加のコア機能が表示されます。

このシナリオは、マークアップのさまざまな要素を、必要に応じてオンまたはオフにできる個別のアプリケーション モードにバインドすることで簡単に実装できます。 次のスクリーン ショットは、詳細モードの RibbonApp アプリケーション メニュー[ホーム] タブを示し、モーダル コントロールを強調表示しています。

screen shot showing a tab for the advanced application mode.screen shot showing the application menu for the advanced application mode.

アプリケーション モードの実装

このセクションでは、リボン フレームワーク アプリケーション モードの実装に通常必要な 3 つの手順について説明します。 RibbonApp は、各ステップの例を提供するために使用されます。

モードを識別する

アプリケーションの各モードは、アプリケーションが操作できるコンテキストに依存する機能の論理セットを表す必要があります。 たとえば、ネットワーク接続が検出されたときにのみ関連するコントロールがアプリケーションに表示される場合、これらのコントロールは ネットワーク モードの 作成を正当化するネットワーク コンテキスト内で動作します。

RibbonApp には、いつでもアクティブにできる 2 つのコンテキスト ( SimpleAdvanced) があります。 したがって、RibbonApp には 、Simple と Advanced の 2 つのモードが必要 です

アプリケーション モードへのコントロールの割り当て

アプリケーション モードが特定されたら、アプリケーション モードをサポートするコントロール要素のマークアップで ApplicationModes 属性を宣言して、各リボン コントロールをモードに割り当てます。

リボン ビューでは、次のコントロール要素でモードを指定できます。

リボン フレームワークでは、これらのコントロール要素はモーダル コントロールと呼ばれます。 これらは、バインドされているモードが UI でアクティブな場合にのみ表示されます。

モーダル コントロール内に含まれるコントロール要素は、アプリケーション モードの動作を継承します。 たとえば、 グループ モーダル コントロールが 詳細 モードに割り当てられ、 詳細設定 モードがアクティブでない場合、その グループ とその中のコントロール (モーダルなど) はリボン UI に表示されません。

ApplicationModes 属性を使用すると、モードは 1:N (1 対多) リレーションシップのモーダル コントロールに割り当てられます。このリレーションシップでは、1 つのモーダル コントロールを複数のモードに関連付けることができます。

リボン フレームワークは、0 から 31 のモードを数値で参照し、モード 0 はリボン アプリケーションの起動時に自動的にアクティブ化される既定のモードと見なされます。 ApplicationModes 属性を指定しないモーダル コントロールは、既定のモードのメンバーと見なされます。

RibbonApp では、 Simple が既定のモードであり、 ユーザー が開始した場合にのみ詳細モード機能が表示されます。

次の例では、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 属性を指定しないモーダル コントロールは、モード 0 (RibbonApp の例では単純モード) に自動的にバインドされるため、既定のモーダル コントロールの属性を明示的に宣言する必要はありません。
  • コントロールは複数のモードにバインドできます。 RibbonApp の場合、単純モード コントロールの ApplicationModes 属性の唯一の必要はcmdSwitchModesボタンです。これは、単純モードと詳細モードの両方の一部であるためです。 いずれかのモードがアクティブな場合、このコントロールは アプリケーション メニューに表示されます。
  • モーダル コントロールは、親から継承しません。 RibbonApp の [詳細設定 ] タブには 、メタデータ グループが含まれています。これらのモーダル コントロールの両方がモード 1 (詳細 モード) に割り当てられます。 [詳細設定] タブをモード 1 に割り当てると、メタデータ グループなどの子コントロールがモード 1 に自動的に割り当てられることはありません。 これにより、タブ内のすべてのグループを実行時に個別に有効または無効にすることができます。
  • モーダル以外のコントロールは、モード スイッチに引き続き依存できます。 RibbonApp の [メタデータの編集] ボタンと [ エラーの確認 ] ボタンは上級ユーザー向けであり、ユーザーが 詳細 モードに切り替わる場合にのみ使用できます。 アプリケーション メニュー内でホストされていないボタン コントロールは非モーダルです。ただし、これらのボタンはモーダル コントロール (メタデータ グループ) 内でホストされるため、グループが表示されると表示されます。 したがって、これらのボタンは、高度なモードがアクティブ化され、 メタデータ グループがリボン UI で公開されるときに表示されます。

実行時にモードを切り替える

マークアップでモードを定義した後は、コンテキスト イベントに応答して簡単に有効または無効にすることができます。 前述のように、リボン アプリケーションは常に既定のモード 0 で起動します。 アプリケーションが初期化され、モード 0 がアクティブになると、 IUIFramework::SetModes 関数を呼び出すことで、アクティブモードのセットを変更できます。 この関数は、アクティブにする必要があるモードのビットごとの表現として 32 ビット整数を受け取ります。最下位ビットはモード 0 を表し、最も重要なビットはモード 31 を表します。 ビットが 0 に設定されている場合、リボン UI ではモードはアクティブになりません。

RibbonApp では、ユーザーが 詳細 モードを有効にすると、高度なコマンドが単純なコマンドと共に表示されます。 モード 0 (Simple) と 1 (Advanced) を UI でアクティブに設定するために、[モードに切り替える] ボタンのコマンド ハンドラーは IUIFramework::SetModes を呼び出します。 この関数呼び出しの 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 で以前に選択したタブを保持しようとします。 呼び出しの前に選択されたタブが新しいモード セットに含まれなくなった場合、リボンはアプリケーション メニューに最も近いタブをレイアウト内で選択 します。 このタブには、ユーザーに最も関連するコマンドが含まれます。 詳細については、「 リボン ユーザー エクスペリエンスガイドライン」を参照してください。

 

解説

リボンには、常に少なくとも 1 つのアクティブ モードが必要です。 アプリケーションが IUIFramework::SetModes を呼び出してモード値 0 を指定してすべてのモードを非アクティブ化しようとすると、E_FAILが返され、アクティブ モード セットは変更されません。

フレームワークでは、リボン UI に常に少なくとも 1 つのタブが存在する必要があります。 その結果、既定のモード (モード 0) と各モード切り替え後に、少なくとも 1 つのタブが公開されている必要があります。

リボン UI のすべての領域がアプリケーション モードの影響を受けるわけではありません。 たとえば、モードを無効にすると、以前 にクイック アクセス ツール バーに追加されたリボンのボタンが消える場合、それらのボタンはクイック アクセス ツール バーに残り、ユーザーはボタンにバインドされたコマンドを実行できます。 一般的なルールとして、Command が 1 つ以上の非アクティブモードに属している場合は、 UI_PKEY_Enabled プロパティを 0 (VARIANT_FALSE) に設定して、そのコマンドも無効にする必要があります。

リボン ユーザー エクスペリエンスガイドライン

コンテキスト タブの表示