たまたま、作業中のアプリケーションがドキュメントで動作しないため、最近開いたドキュメントのリストをアプリケーションメニューに表示する必要はありません。
しかし、-厄介なことに-RibbonApplicationMenu
未使用を非表示にするためにクラスですぐに利用できるプロパティはありませんAuxiliaryPane
(不思議なことに、プロパティは存在しますが、「内部」としてマークされています)。
もちろん、そのままにしておくこともできますが、それは...乱雑です。
だから、これが私が思いついた解決策です。
それが他の誰かのために役立つことを願っています:-)
一般的な考え方は、をサブクラス化しRibbonApplicationMenu
、メニューのポップアップに対応するテンプレートの子を見つけて、それを却下することです(多くの苛立たしい実験の後、それを実行しても、のためにも、両方Width
に対しても、何も達成できないことが明らかになりました)。PART_AuxiliaryPaneContentPresenter
PART_FooterPaneContentPresenter
さて、これ以上の苦労なしに、ここにコードがあります:
public class SlimRibbonApplicationMenu : RibbonApplicationMenu
{
private const double DefaultPopupWidth = 180;
public double PopupWidth
{
get { return (double)GetValue(PopupWidthProperty); }
set { SetValue(PopupWidthProperty, value); }
}
public static readonly DependencyProperty PopupWidthProperty =
DependencyProperty.Register("PopupWidth", typeof(double),
typeof(SlimRibbonApplicationMenu), new UIPropertyMetadata(DefaultPopupWidth));
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.DropDownOpened +=
new System.EventHandler(SlimRibbonApplicationMenu_DropDownOpened);
}
void SlimRibbonApplicationMenu_DropDownOpened(object sender, System.EventArgs e)
{
DependencyObject popupObj = base.GetTemplateChild("PART_Popup");
Popup popupPanel = (Popup)popupObj;
popupPanel.Width = (double)GetValue(PopupWidthProperty);
}
}
補足として、(XAMLのDependencyPropertyを介して明示的に設定するのではなく)ApplicationMenuのItemsの最大幅に基づいて目的の幅を解決する方法を見つけようとしましたが、役に立ちませんでした。
「マジックナンバー」に対する私の軽蔑を考えると、それについての提案は深く感謝されます。