Так получилось, что приложение, над которым я работаю, не работает с документами, поэтому нет необходимости отображать список недавно открытых документов в меню приложения.
Но - досадно - в классе 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);
}
}
В качестве примечания я попытался найти способ разрешить желаемую ширину на основе максимальной ширины элементов ApplicationMenu (вместо того, чтобы задавать ее явно через DependencyProperty в XAML) - но безрезультатно.
Учитывая мое презрение к "магическим числам", любые предположения на , что , будут высоко оценены.