101 votes

WPF Barre d'outils: comment supprimer la prise en main et le débordement

Dans un WPF imbriqué ToolBarPanel-ToolBar-Menu, nous voulons nous débarrasser de la poignée de préhension à gauche et de la zone de débordement à droite. ils sont tous les deux grisé, mais nous aimerions qu'ils ne s'affichent pas du tout.

Des idées sur la façon d'accomplir cela?

au cas où mes termes ne seraient pas entièrement corrects, si vous regardez l'image de la Figure 3 du lien ci-dessous, sur la plus basse des trois barres d'outils, il y a la poignée à gauche du menu déroulant et à droite du bouton le plus à droite il y a le débordement.

Image des barres d'outils

0 votes

Vous pourriez probablement le faire en écrasant le modèle de contrôle... mais je ne le recommanderais pas.

0 votes

Vous pouvez mettre Margin = "0,0,-14,0" sur la barre d'outils pour pousser le côté droit hors de la vue. C'est la solution la plus simple que j'ai trouvée, mais je n'ai testé qu'avec une seule barre d'outils, pas à l'intérieur d'un ToolBarPanel ou d'un ToolBarTray.

164voto

rmoore Points 9561

La poignée peut être retirée en définissant la propriété attachée ToolBarTray.IsLocked="True" sur la ToolBar.

Pour supprimer le Overflow ToggleButton, vous devrez le supprimer dans un ControlTemplate personnalisé comme le suggère sixlettervariables, ce qui n'est pas trop difficile si vous avez Blend ou si vous pouvez télécharger le Blend 3 Preview.

Vous pouvez également simplement masquer le bouton dans l'événement Loaded de la ToolBar, bien que quel que soit le chemin que vous prenez, vous devriez également définir la propriété attachée ToolBar.OverflowMode="Never" sur le menu de la ToolBar, de sorte que les éléments ne puissent pas déborder accidentellement dans une zone inaccessible.

Et définissez le Overflow ToggleButton sur collapsed :

private void ToolBar_Loaded(object sender, RoutedEventArgs e)
{
    ToolBar toolBar = sender as ToolBar;
    var overflowGrid = toolBar.Template.FindName("OverflowGrid", toolBar) as FrameworkElement;
    if (overflowGrid != null)
    {
        overflowGrid.Visibility = Visibility.Collapsed;
    }
    var mainPanelBorder = toolBar.Template.FindName("MainPanelBorder", toolBar) as FrameworkElement;
    if (mainPanelBorder != null)
    {
        mainPanelBorder.Margin = new Thickness();
    }
}

18 votes

Se pose la question: Pourquoi utiliser une ToolBar du tout? Pourquoi ne pas simplement utiliser un StackPanel simple avec des boutons? Quels avantages offre la ToolBar?

5 votes

En réponse à Josh G : Si vous utilisez un bouton transparent avec une image sur un panneau normal (StackPanel, etc.), il aura un contour blanc. Lorsque le même bouton est placé sur une barre d'outils, cependant, le contour blanc n'est pas présent.

2 votes

Ceci est également utile si vous souhaitez le thème d'une barre d'outils dans ce contexte, par exemple, le comportement au survol de la souris.

11voto

John Fisher Points 13621

Vous pouvez "supprimer" le débordement sans fournir un nouveau modèle de contrôle en définissant la ToolBar avec des marges droites négatives (et ajouter une marge gauche négative pour qu'elle ne paraisse pas étrange avec des bords gauches arrondis mais droits). Ensuite, ajoutez ClipToBounds="True" au ToolBarPanel qui coupera les bords de la barre d'outils qui dépassent maintenant de la zone du panneau.

    . . .

8voto

user7116 Points 39829

Vous pouvez utiliser Blend pour remplacer assez simplement le ControlTemplate pour ToolBarPanel, Menu, ou ToolBar.

  1. Clic droit sur la ToolBar et sélectionnez Modifier le modèle
  2. Dans Modifier le modèle, sélectionnez Modifier une copie
  3. Je recommande d'ajouter la copie à un dictionnaire des ressources
  4. Cliquez sur OK

Vous allez maintenant modifier le modèle de contrôle pour ToolBarPanel, et pouvez définir la visibilité sur Collapsed pour la poignée et le signal de débordement. Vous pouvez répéter la même démarche pour les autres contrôles. Cela prend un peu de temps, mais ce n'est pas terriblement difficile avec Blend.

0 votes

Merci pour l'info. Malheureusement, blend2 et vs2008 ne semblent pas bien fonctionner ensemble pour nous, trop de problèmes lorsque l'on travaille avec du code généré dans l'autre, donc nous ne laissons actuellement pas blend approcher notre code vs ;)

1 votes

Oui, nous avons utilisé Blend assez religieusement jusqu'à ce que VS2k8SP1 soit arrivé. En fait, je souhaite que l'éditeur WPF dans VS2k8 était Blend. Beaucoup plus agréable de pouvoir faire un clic droit sur quelque chose et dire Grouper dans 'StackPanel' ou 'Border'. Dommage que Microsoft veuille qu'ils soient des expériences différentes.

0 votes

Je pense que le nouveau XAML Power Toys ajoute une fonctionnalité qui vous permet de regrouper des contrôles. (Peut-être sont-ce les MoXAML Power Toys...)

6voto

Thomas Levesque Points 141081

Au lieu de masquer complètement le bouton de débordement, je pense qu'il est préférable de le montrer uniquement lorsque c'est nécessaire. Cela peut être fait en liant sa propriété Visibilité à sa propriété IsEnabled :

private static void FixupToolBarOverflowArrow(ToolBar toolBar)
{
    Action fixup = () =>
    {
        var overflowButton = toolBar.Template.FindName("OverflowButton", toolBar) as ButtonBase;
        if (overflowButton != null)
        {
            overflowButton.SetBinding(
                VisibilityProperty,
                new Binding("IsEnabled")
                {
                    RelativeSource = RelativeSource.Self,
                    Converter = new BooleanToVisibilityConverter()
                });
        }
    };

    if (toolBar.IsLoaded)
    {
        fixup();
    }
    else
    {
        RoutedEventHandler handler = null;
        handler = (sender, e) =>
        {
            fixup();
            toolBar.Loaded -= handler;
        };

        toolBar.Loaded += handler;
    }
}

(la même chose peut être faite en XAML en redéfinissant le modèle)

3voto

Belmiris Points 416

Je débute tout juste avec WPF et je n'ai pas réussi à cacher ma flèche de débordement avec aucune des méthodes ci-dessus (Visual Studio 2010). La seule chose qui semblait affecter la flèche était l'exemple Toolbar_Load ci-dessus, mais tout ce qu'il faisait était de transformer la flèche en un espace vide qui avait l'air aussi mauvais que la flèche. La manière la plus simple que j'ai trouvée était simplement de définir les marges de la barre d'outils.

         Margin="0,0,-13,0">

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X