RibbonApplicationMenu:摆脱AuxiliaryPane

时间:2011-11-06 22:46:16

标签: wpf wpf-controls ribbon ribboncontrolslibrary

碰巧我正在处理的应用程序不对文档进行操作,因此无需在应用程序菜单中显示最近打开的文档列表。
但是 - 令人讨厌的是 - RibbonApplicationMenu类中没有可用的属性来隐藏未使用的AuxiliaryPane(奇怪的是,该属性确实存在,但标记为“内部”)。
当然,我可以把它留在那里 - 但那是......不整洁。

所以,这是我提出的解决方案。
希望它对其他人有用:-)

一般的想法是继承RibbonApplicationMenu,找到对应于菜单弹出窗口的模板子项,并否决它的Width(经过一系列令人沮丧的实验后,很明显这样做对{ {1}}也不是PART_AuxiliaryPaneContentPresenter - 也不是两者 - 都可以实现任何目标。

好吧,不用多说了,这是代码:

PART_FooterPaneContentPresenter

作为旁注,我试图找到任何方法来根据ApplicationMenu的项目的最大宽度来解析所需的宽度(而不是通过XAML中的DependencyProperty显式设置它) - 但无济于事。
鉴于我对“魔术数字”的鄙视,对 的任何建议都将深表赞赏。

2 个答案:

答案 0 :(得分:2)

我知道这已经有一段时间了,但我还有另一个解决方案。这个不提供Popup width属性,而是提供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);
        }
    }
}

答案 1 :(得分:-2)

为我工作

<telerik:ApplicationMenu RightPaneVisibility="Collapsed" >