Windowsエクスプローラーなど、Windowsに付属する純正アプリでも最近ではリボンを使用したものをよく目にするようになった。本稿では、リボンを持ったWPFアプリを構築する方法を解説する。
対象:.NET 4.5以降
Microsoft Officeですっかりおなじみとなったリボンインターフェース(以降、リボンUI)を、WPFのプログラムでも使いたいと思ったことはないだろうか? リボンUIはOffice 2007から導入されたのだが、WindowsフォームやWPFでのプログラミングでは長らくサポートされなかった。ようやくVisual Studio 2010のときに、別途導入するコンポーネントとして「Microsoft Ribbon for WPF」が提供された。そして、Visual Studio 2012(.NET Framework 4.5)からは標準で含まれるようになった。そこで本稿では、Visual Studio 2012/2013でリボンUIを実装する手順の概要を説明する。
なお、本稿のプログラミングには、無償のVisual Studio Express 2012 for Windows Desktop(以降、VS 2012)を使用した。Visual Studio 2013でも手順は同じである。
Visual StudioでWPFのプロジェクトを新しく作成する。プロジェクトにはフォルダーを追加する(ここでは「Assets」という名前にした)。そこに、後でアイコンとして使うための画像ファイル(pngフォーマット)をいくつか適当に配置しておいてほしい*1。配置した画像ファイルの[ビルド アクション]は[Resource]でなければならない(次の画像)。
*1 自動的に拡大/縮小されるので、試してみるだけならば画像のサイズにはこだわらなくてよい。なお、本稿では「Visual Studio Image Library」の画像ファイルを使用している。
次のような手順で行う。
以降では、1から4のステップごとに解説していく。
既定ではリボンUIへの参照が設定されていないので、次のアセンブリへの参照を追加する(次の画像)。
これで、XAMLコードでリボンUIを記述できるようになった。リボンUIのコントロールをVisual Studioのツールボックスから利用するには、次の「ツールボックスにコントロールを追加する」手順を行う。
XAMLコードをキーボードから直接編集するのであれば、この手順は必要ない。Visual Studioのツールボックスからコントロールを画面にドラッグ&ドロップする、あるいは、ツールボックス上でコントロールをダブルクリックする方法によって画面にコントロールを配置するのであれば、以下の手順でツールボックスにリボンUIのコントロールを追加しておく。
まず、[ツールボックス アイテムの選択]ダイアログを開く。
[ツールボックス アイテムの選択]ダイアログの[WPF コンポーネント]タブで、名前が「Ribbon」で始まるコントロールを探し、使いたいものにチェックを入れ、[OK]ボタンをクリックする。
これで、次の画像のように、リボンUIのコントロールがツールボックスに追加された。
以上で、リボンUIを記述できるようになった。リボンUIの個々のコントロールの使い方を説明するだけの紙幅はないので、MSDNの「System.Windows.Controls.Ribbon 名前空間」のリファレンスなどを参照してもらいたい。
参考までに、冒頭に掲載した画面のXAMLコードを次に掲載しておく。
<Window x:Class="dotNetTips1081CS.MainWindow"
……省略……
Title=".NET TIPS 1081" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/><!-- 上部にリボンUIを配置する -->
<RowDefinition/>
</Grid.RowDefinitions>
<Ribbon x:Name="Ribbon1"><!-- リボンUIの全体はRibbonコントロールに収める -->
<!-- ヘルプペイン:右端の[?]アイコン -->
<Ribbon.HelpPaneContent>
<RibbonButton SmallImageSource="Assets/……省略……" />
</Ribbon.HelpPaneContent>
<!-- クイックアクセスツールバー:上端の[save][undo][redo]アイコン -->
<Ribbon.QuickAccessToolBar>
<RibbonQuickAccessToolBar>
<RibbonButton x:Name ="Save" SmallImageSource="Assets/……省略……" />
<RibbonButton x:Name ="Undo" SmallImageSource="Assets/……省略……" />
<RibbonButton x:Name ="Redo" SmallImageSource="Assets/……省略……" />
</RibbonQuickAccessToolBar>
</Ribbon.QuickAccessToolBar>
<!-- アプリケーションメニュー:上部左端の下向き三角 -->
<Ribbon.ApplicationMenu>
<RibbonApplicationMenu KeyTip="F">
<RibbonApplicationSplitMenuItem Header="情報" KeyTip="I" ImageSource="Assets/……省略……" >
<RibbonApplicationMenuItem Header="情報のサブメニュー1" />
<RibbonApplicationMenuItem Header="情報のサブメニュー2" />
</RibbonApplicationSplitMenuItem>
<RibbonApplicationMenuItem Header="終了" KeyTip="X" ImageSource="Assets/……省略……" />
</RibbonApplicationMenu>
</Ribbon.ApplicationMenu>
<!-- リボンタブ #1: [タブ1] -->
<RibbonTab Header="タブ1" KeyTip="H" >
<!-- グループ1-1 -->
<RibbonGroup x:Name="Group1_1" Header="グループ1-1">
<RibbonMenuButton Label="MenuButton1-1" KeyTip="A" LargeImageSource="Assets/……省略……" >
<RibbonMenuItem Header="MenuItem1" KeyTip="B" ImageSource="Assets/……省略……" />
<RibbonMenuItem Header="MenuItem2" KeyTip="C" ImageSource="Assets/……省略……" />
</RibbonMenuButton>
<RibbonButton Label="Button1-1" KeyTip="X" SmallImageSource="Assets/……省略……" />
<RibbonButton Label="Button1-2" KeyTip="C" SmallImageSource="Assets/……省略……" />
<RibbonButton Label="Button1-3" KeyTip="V" SmallImageSource="Assets/……省略……" />
</RibbonGroup>
<!-- グループ1-2 -->
<RibbonGroup x:Name="Group1_2" Header="グループ1-2">
<RibbonButton Label="Button2-1" KeyTip="A" LargeImageSource="Assets/……省略……" />
<RibbonCheckBox Label="CheckBox1" IsChecked="True" />
<RibbonTextBox Label="TextBox1">テキスト</RibbonTextBox>
<RibbonToggleButton Label="ToggleButton1" IsChecked="True" />
</RibbonGroup>
</RibbonTab>
<!-- リボンタブ #2: [タブ2] -->
<RibbonTab Header="タブ2" KeyTip="O" >
……省略……
</RibbonTab>
<!-- リボンタブ #3: [タブ3] -->
<RibbonTab Header="タブ3" KeyTip="V" >
……省略……
</RibbonTab>
</Ribbon>
</Grid>
</Window>
これでビルドし、実行してみると次の画像のようになる。
上の画面は、何かおかしくないだろうか? そう、クイックアクセスツールバー(赤枠内)が、タイトルバーの中に入っていないのだ。次の手順で修正する。
リボンUIを使う画面は、通常のWindowクラス(System.Windows名前空間)ではなく、RibbonWindowクラス(System.Windows.Controls.Ribbon名前空間)を継承しなければならない。RibbonWindowクラスを使うことで、タイトルバーの中にクイックアクセスツールバーとコンテキストタブ*2が表示されるようになる。
*2 コンテキストタブ:リボンUIで、特定の場合のみ表示されるタブ。例えばExcelで、貼り付けた図形を編集しようとしてクリックすると、リボンUIに[描画ツール/書式]というタブが現れる。このタブは、通常のタブの名前の位置に[書式]と表示されているが、さらにその上(すなわち、タイトルバーの中)に[描画ツール]という表示が出ている。
RibbonWindowクラスを使うには、まずコードビハインドを次のコードのように修正する。
//public partial class MainWindow : Window
// ↓ 継承元をWindowクラスからRibbonWindowクラスに変更する
public partial class MainWindow : System.Windows.Controls.Ribbon.RibbonWindow
Class MainWindow
Inherits System.Windows.Controls.Ribbon.RibbonWindow ' ←継承元を指定する行を追加する
次に、XAMLコードを次のように修正する。
<!-- Window x:Class="dotNetTips1081CS.MainWindow"
↓WindowクラスからRibbonWindowクラスに変更する -->
<RibbonWindow x:Class="dotNetTips1081CS.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title=".NET TIPS 1081" Height="350" Width="525">
……省略……
<!-- /Window -->
</RibbonWindow>
以上で、リボンUIの構築は完了だ。この後、コマンドなどを実装していくことになる(本稿では扱わない)。
作成した画面はすでに冒頭で紹介したが、その他タブの動きなども紹介しておこう。コードビハインドには何もコーディングしておらず、これらの動作は全て前述したXAMLコードだけによるものだ。
まず、アプリケーションメニュー(System.Windows.Controls.Ribbon名前空間のRibbonApplicationMenuコントロール)の動作。
メニューボタン(System.Windows.Controls.Ribbon名前空間のRibbonMenuButtonコントロール)は、クリックするとメニュー(同名前空間のRibbonMenuItemコントロール)が出てくる。
最後は、タブ(System.Windows.Controls.Ribbon名前空間のRibbonTabコントロール)を切り替えた様子。
なお、[Alt]キーを押すとキーチップが表示され、キーボードだけで操作が可能になる。キーチップは、XAMLコードで各コントロールにKeyTip属性を指定することで表示される。
利用可能バージョン:.NET Framework 4.5以降
カテゴリ:WPF/XAML 処理対象:Ribbonコントロール
使用ライブラリ:Ribbonコントロール(System.Windows.Controls.Ribbon名前空間)
Copyright© Digital Advantage Corp. All Rights Reserved.