RibbonApplicationMenu: избавление от вспомогательной панели - PullRequest
1 голос
/ 07 ноября 2011

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

Ответы [ 2 ]

2 голосов
/ 29 октября 2012

Я знаю, что это было давно, но у меня есть другое решение для этого. Этот не предоставляет свойство ширины Popup, вместо логического ShowAuxilaryPanel. Затем он переходит к Привязать ширину всплывающего окна к ширине области пункта меню в меню.

public class SlimRibbonApplicationMenu : RibbonApplicationMenu
{
    public bool ShowAuxilaryPanel
    {
        get { return (bool)GetValue(ShowAuxilaryPanelProperty); }
        set { SetValue(ShowAuxilaryPanelProperty, value); }
    }

    public static readonly DependencyProperty ShowAuxilaryPanelProperty =
        DependencyProperty.Register("ShowAuxilaryPanel", typeof(bool),
        typeof(SlimRibbonApplicationMenu), new UIPropertyMetadata(true));

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        this.DropDownOpened += SlimRibbonApplicationMenu_DropDownOpened;
    }

    void SlimRibbonApplicationMenu_DropDownOpened(object sender, EventArgs e)
    {
        DependencyObject popupObj = base.GetTemplateChild("PART_Popup");
        Popup panel = (Popup)popupObj;
        var exp = panel.GetBindingExpression(Popup.WidthProperty);

        if (!this.ShowAuxilaryPanel && exp == null)
        {
            DependencyObject panelArea = base.GetTemplateChild("PART_SubMenuScrollViewer");

            var panelBinding = new Binding("ActualWidth")
            {
                Source = panelArea,
                Mode = BindingMode.OneWay
            };
            panel.SetBinding(Popup.WidthProperty, panelBinding);
        }
        else if (this.ShowAuxilaryPanel && exp != null)
        {
            BindingOperations.ClearBinding(panel, Popup.WidthProperty);
        }
    }
}
0 голосов
/ 17 сентября 2014

работал для меня

<telerik:ApplicationMenu RightPaneVisibility="Collapsed" >
...