前回から間が空きましたが、第3回。今回はRibbonApplicationMenuを見ていきたいと思います。様々なApplicationMenuRibbonApplicationMenuは、プラットフォームごとに違いが大きい項目です。Office2007http://support.microsoft.com/kb/926338/ja最初に、Ribbonが導入されたアプリケーションですね。ApplicationMenuを開くためのボタンが特徴的です。Office2010Officeは次のバージョンから、大きく変わってます。ApplicationMenuがボタンではなくて、タブになりました。表示内容もWindowいっぱいに表示されるようになってます。Office2013も基本は同じです。ペイント(Windows7)Office2007と2010の中間みたいなデザインになっています。メニューを開くためのボタンはタブになっていますが、メニューはDropDown形式です。タブに表示されるのがアイコンなのが特徴です。ペイント(Windows8)基本はWindows7のペイントと同じですが、タブに表示されるのがアイコンから文字に変更されています。WPFのApplicationMenuRibbonApplicationMenuは、ItemsControlのサブクラスです。子要素のItemsを表示する領域のほかに、アイコンを表示する領域・補助ペイン・フッターペインが拡張されています。上記ApplicationMenuを表示するためのXAMLは以下の通りです。(アイコン)ApplicationMenuを表示するためのタブに表示する画像を指定します。RibbonApplicationMenuクラスにはLabelプロパティーがありますが、使用されません。画像のみ指定可能です。(※)どうしても文字列を表示したい場合はGlyph関連クラスを利用することで表示可能となります。(補助ペイン)補助ペインは、多くのアプリケーションで最近使ったファイルなどを表示する領域になっています。WPFではContentControlのContent相当の領域となっているので、どのようなコントロールでもホスト可能です。RibbonGalleryをホストするの一般的のようです。(フッター)この領域もAuxiliaryPaneContentと同様、どのようなコントロールでもホスト可能です。Office2007ではボタンが設置されていましたが、それ以外のアプリケーションではこの領域は使われていません。(メニュー)ItemsControlの子要素をホストするための領域です。RibbonSeparatorをとることができます。RibbonSeparatorをホストすることができます。各コントロールの違いは下記通りです。RibbonApplicationMenuItemApplicationMenu内に表示される通常のメニューです。アイコンとラベルを表示可能で、階層表示もできます。RibbonApplicationSplitMenuItemApplicationMenu内に表示される分割されたメニューです。アイコンとラベルを表示可能で、階層表示もできます。通常のメニューでは子要素を持つ場合に親要素で処理を実行することはできませんが、SplitMenuでは親要素で処理実行を行うこともできる点が異なります。RibbonSeparatorメニューの区切りです。それ以上の役割はありません。RibbonGalleryはまたの機会に。Bindingに挑戦RibbonApplicationMenuはItemsControlのサブクラスなので、ItemsSourceにBindingすることで子要素を作成することができます。ItemContainerに相当するものが、3種類あるため一工夫が必要になります。BindingするClassを定義しておきます。恣意的ではありますが、後々のために以下のようにしました。},};で、XAML。Bindingだけバージョン。&lt;/Ribbon.ApplicationMenu&gt;&lt;/Ribbon&gt;これを実行すると、以下のようになります。メニュー部分がItemsControlになっているのがよくわかります。このままではアレなのでItemTemplateにDataTemplateを適用するのが常套手段です。Menuは、階層構造をとるものなのでHierarchicalDataTemplateになります。XAMLは以下のように修正しました。&lt;/Ribbon.ApplicationMenu&gt;&lt;/Ribbon&gt;TextプロパティーをTextBlockとBindingすることで、メニューラベルが表示されるようになります。それっぽっくなりました。ItemTemplateで変更できるのはContentPresenterの内部だけです。RibbonApplicationMenuItemのImageSouceプロパティーは、ItemTemplateからは設定することができません。Container自身のプロパティーは、ItemContainerStyleを通じて設定します。&lt;/Ribbon.ApplicationMenu&gt;&lt;/Ribbon&gt;Style設定後の画面は次の通りです。無事アイコンが設定されました。ItemContainerStyleで出来るのもここまでです。Container自体の型は変更できません、RibbonApplicationMenuItemのままです。Containerの型を変更することができません。これを変更するには、ItemContainerTemplateSelectorを使用します。TemplateSelector系は、XAMLだけで閉じないのがつらい感じですね。いうわけで以下のようなClassを用意します。}}で、これを使うと、こんな感じで書けます。ItemsContainerTemplateSelectorに渡すための各種DataTemplateを定義し、ItemsContainerTemplateSelectorとそれを有効にするためのUsesItemContainerTemplateを設定します。&lt;/Ribbon&gt;&lt;/Grid&gt;すると、下記通りメニューを設定するとことができます。結局ItemsTemplateとItemContainerStyleは使わなくてよかったんですね。実行はできるのですが、XAMLを開くと「プロパティーにループ参照があります。」というエラーが出ます。確かにループ参照しているので、指摘の通りなのですが、エラーになるのはなんだか嫌ですね。その他TipsApplicationMenuを表示しないRibbonApplicationMenuのVisibilityを設定することで可能です。Visibility=&quot;Collapsed&quot;/&gt;&lt;/Ribbon.ApplicationMenu&gt;不具合っぽいのWPFのApplicationMenuには、表示が左側にずれるという環境依存の不具合があります(※1)。表示位置がずれる環境では、その他アプリケーションのDropDownの位置ももれなくずれているため(※2)、完全にWPFのせいというわけではないようです。ApplicationMenuがずれるのはWPFだけなのですよね(※3)。解決方法をご存知の方は教えてください。CodePlexにはこれに関するIssueが登録されているようです(※4)。ちなみに、この不具合は、Windows7でもWindows8でも発生を確認しています。コメントをキャンセルコメントを入力してください。以下に詳細を記入するか、アイコンをクリックしてログインしてください。アカウントを使ってコメントしています。アカウントを使ってコメントしています。アカウントを使ってコメントしています。アカウントを使ってコメントしています。新しいコメントがついたらメールで通知。あの長文blogをめちゃめちゃわかりやすくまとめていただきました。非常にとっつきやすいので、他の方にWaaSを説明する際にはぜひご活用ください。agoモニタ買うなら4Kやろ。Blog.投稿先:キャンセル%d人のブロガーが「いいね」をつけました。