1

たまたま、作業中のアプリケーションがドキュメントで動作しないため、最近開いたドキュメントのリストをアプリケーションメニューに表示する必要はありません。
しかし、-厄介なことに-RibbonApplicationMenu未使用を非表示にするためにクラスですぐに利用できるプロパティはありませんAuxiliaryPane(不思議なことに、プロパティは存在しますが、「内部」としてマークされています)。
もちろん、そのままにしておくこともできますが、それは...乱雑です。

だから、これが私が思いついた解決策です。
それが他の誰かのために役立つことを願っています:-)

一般的な考え方は、をサブクラス化しRibbonApplicationMenu、メニューのポップアップに対応するテンプレートの子を見つけて、それを却下することです(多くの苛立たしい実験の後、それを実行しても、のためにも、両方Widthに対しても、何も達成できないことが明らかになりました)。PART_AuxiliaryPaneContentPresenterPART_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の最大幅に基づいて目的の幅を解決する方法を見つけようとしましたが、役に立ちませんでした。
「マジックナンバー」に対する私の軽蔑を考えると、それについての提案は深く感謝されます。

4

2 に答える 2

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);
        }
    }
}
于 2012-10-29T13:40:23.970 に答える
-2

私のために働いた

<telerik:ApplicationMenu RightPaneVisibility="Collapsed" >
于 2014-09-17T14:10:12.693 に答える