web-dev-qa-db-fra.com

WPF ToolBar: comment supprimer le grip et le débordement

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

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

juste au cas où mes termes ne seraient pas tout à fait corrects, si vous regardez l'image de la figure 3 du lien ci-dessous, au bas des trois barres d'outils, vous trouverez le grip situé à gauche du menu déroulant et à droite du doigt bouton il y a le débordement.

Image des barres d'outils

90
Tom

La poignée peut être supprimée en définissant la propriété attachée ToolBarTray.IsLocked="True" dans la barre d’outils.

Pour supprimer le Overflow ToggleButton , vous devrez le supprimer dans un ControlTemplate personnalisé, comme le suggère sixlettervariables. Si vous avez mélangé ou pouvez télécharger l’Aperçu du mélange 3 n’est pas excessivement difficile. 

Vous pouvez également simplement masquer le bouton dans l'événement chargé de la barre d'outils. Toutefois, quelle que soit la route choisie, vous devez également définir la propriété attachée ToolBar.OverflowMode="Never" dans le menu de la barre d'outils, afin que les éléments ne puissent pas déborder accidentellement dans une zone inaccessible.

<ToolBarPanel DockPanel.Dock="Top">
    <ToolBar ToolBarTray.IsLocked="True" Loaded="ToolBar_Loaded">
        <Menu ToolBar.OverflowMode="Never">
            <MenuItem Header="File" />
            <MenuItem Header="New" />
        </Menu>
    </ToolBar>
</ToolBarPanel>

Et définissez le Overflow ToggleButton sur réduit:

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();
    }
}
139
rmoore

Vous pouvez utiliser Blend pour remplacer plutôt simplement ControlTemplate pour ToolBarPanel, Menu ou ToolBar.

  1. Faites un clic droit sur la barre d'outils 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 de ressources
  4. Cliquez sur OK

Vous allez maintenant modifier le modèle de contrôle pour ToolBarPanel et définir la visibilité sur Collapsed pour le signal de saisie et de dépassement de capacité. Vous pouvez rincer et répéter pour les autres contrôles. Cela prend un peu de temps, mais ce n'est pas très difficile avec Blend.

8
user7116

Vous pouvez "supprimer" le débordement sans fournir un nouveau modèle de contrôle en définissant la ToolBar pour avoir des marges droites négatives (et ajoutez une marge gauche négative pour qu'elle ne semble pas étrange avec des bords gauche arrondis mais des bords carrés droits). Ajoutez ensuite ClipToBounds="True" à la ToolBarPanel qui coupera les bords de la barre d’outils qui collent à l’extérieur de la zone du panneau.

<ToolBarPanel Grid.Row="0" ClipToBounds="True">
    <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0">
    . . .
5
John Fisher

Plutôt que de cacher complètement le bouton de débordement, je pense qu'il est préférable de ne le montrer que lorsque cela est nécessaire. Cela peut être fait en liant sa propriété Visibility à 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)

4
Thomas Levesque

Je viens juste de commencer avec WPF et je ne pouvais utiliser aucune des méthodes ci-dessus pour masquer ma flèche de débordement (Visual Studio 2010). La seule chose qui semblait affecter la flèche était l'exemple de Toolbar_Load ci-dessus, mais tout ce que cela faisait était un espace vide qui avait l'air aussi mauvais que la flèche. Le moyen le plus simple que je pouvais comprendre consistait simplement à définir les marges de la barre d’outils. 

<ToolBar Height="26" 
         Name="toolBar" 
         DockPanel.Dock="Top" 
         ToolBarTray.IsLocked="True" 
         ToolBar.OverflowMode="Never"        <!-- no effect -->
         Margin="0,0,-13,0">                 <!-- worked -->
         <Menu ToolBar.OverflowMode="Never"> <!-- no affect -->
             <MenuItem Header="_File"></MenuItem>
         </Menu>
</ToolBar>
3
Belmiris

Les méthodes ci-dessus permettent de masquer le débordement. J'ai utilisé les éléments suivants pour masquer le préhenseur:

         <Label Height="44" Width="30" Background="{StaticResource CtrlBackground}" Margin="-20,0,0,0"></Label>

pour une mise en page horizontale, et

         <Label Height="44" Width="230" Background="{StaticResource CtrlBackground}" Margin="0,-20,0,0" HorizontalAlignment="Left"></Label>

pour une mise en page verticale. Placez ce qui suit après la barre d’outils

Utilisez la largeur et la hauteur nécessaires pour vos boutons.

Kaxaml est excellent pour jouer avec ce genre de choses. 

0
frediano