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.
Qu'est-ce qui se passe si vous définissez 'AuxiliaryPaneContent' null? – Vlad
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
Vlad: J'ai essayé les deux. Ni travaillé. – Alex