2011-11-06 47 views
1

恰巧我正在使用的應用程序不能在文檔上操作,所以不需要在應用程序菜單中顯示最近打開的文檔列表。
但是 - 令人煩惱的是 - 在RibbonApplicationMenu類中沒有容易獲得的屬性來隱藏未使用的AuxiliaryPane(爲此,好奇地,該屬性確實存在,但被標記爲「內部」)。
當然,我可以把它留在那裏 - 但那是... un。。RibbonApplicationMenu:擺脫輔助平板

所以,這是我想出的解決方案。
希望這將有助於其他人:-)

的總體思路是繼承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的項目的最大寬度(而不是設置任何的方式來解決所需的寬度它明確通過XAML中的DependencyProperty) - 但無濟於事。
鑑於我對「幻數」的鄙視,對的任何建議將深表感謝。

+0

如果你設置'AuxiliaryPaneContent'爲空,會發生什麼? – Vlad

+0

或者您也許可以訪問'PART_AuxiliaryPaneContentPresenter'而不需要創建原始菜單的子類('menu.Template.FindName(「PART_AuxiliaryPaneContentPresenter」,menu);')並將其可見性設置爲隱藏? – Vlad

+0

弗拉德:我試了兩種。都沒有工作。 – Alex

回答

2

我知道這已經有一段時間了,但我已經得到了另一個解決方案。這個不提供Popup width屬性,而是一個ShowAuxilaryPanel布爾值。然後它將Popup的寬度綁定到菜單的菜單項區域的寬度。

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

下面的XAML塊爲我解決了這個問題。

<ribbon:Ribbon.ApplicationMenu> 
     <ribbon:RibbonApplicationMenu Visibility="Collapsed" /> 
</ribbon:Ribbon.ApplicationMenu> 
-1

工作對我來說

<telerik:ApplicationMenu RightPaneVisibility="Collapsed" >