2011-11-06 2 views
1

Il est arrivé que l'application sur laquelle je travaille ne fonctionne pas sur les documents, il n'est donc pas nécessaire d'afficher la liste des documents récemment ouverts dans le menu de l'application.
Mais - de manière gênante - il n'y a aucune propriété facilement disponible dans la classe RibbonApplicationMenu pour masquer les AuxiliaryPane non utilisés (pour lesquels, curieusement, la propriété existe, mais est marquée comme "interne").
Bien sûr, je peux juste le laisser là - mais c'est ... désordonné. Donc, voici la solution que j'ai trouvée.
espère que ce sera utile pour tout le monde :-)RibbonApplicationMenu: se débarrasser de l'AuxiliaryPane

L'idée générale est de sous-classe le RibbonApplicationMenu, trouver l'enfant modèle correspondant Popup du menu et passer outre son Width (après un certain nombre d'expériences frustrantes il est devenu évident que cela ne soit pas le cas pour PART_AuxiliaryPaneContentPresenter ni pour PART_FooterPaneContentPresenter - ni pour les deux - n'a pu réaliser quoi que ce soit).

Eh bien, sans plus tarder, voici le code:

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); 
    } 
} 

Comme une note de côté, j'ai essayé de trouver un moyen de régler la largeur souhaitée en fonction de la largeur maximale des articles du ApplicationMenu (plutôt que la mise en explicitement à travers le DependencyProperty dans XAML) - mais en vain.
Compte tenu de mon mépris pour les "nombres magiques", toute suggestion sur que sera grandement appréciée.

+0

Qu'est-ce qui se passe si vous définissez 'AuxiliaryPaneContent' null? – Vlad

+0

Ou vous pouvez peut-être accéder 'PART_AuxiliaryPaneContentPresenter' sans sous-classer le menu original (' menu.Template.FindName ("PART_AuxiliaryPaneContentPresenter", menu); ') et définir sa visibilité à caché? – Vlad

+0

Vlad: J'ai essayé les deux. Ni travaillé. – Alex

Répondre

2

Je sais que cela fait un moment, mais j'ai une autre solution à cela. Celui-ci ne fournit pas la propriété de largeur de popup, à la place un booléen ShowAuxilaryPanel. Il va ensuite à Lier la largeur de l'Popup, à la largeur de la zone de l'élément de menu du menu.

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

Le bloc suivant de XAML a résolu ce problème pour moi.

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

a fonctionné pour moi

<telerik:ApplicationMenu RightPaneVisibility="Collapsed" >