Barra degli strumenti WPF: come rimuovere grip e overflow


98

In un WPF ToolBarPanel-ToolBar-Menu annidato vogliamo eliminare la maniglia di presa a sinistra e l'area di overflow a destra. sono entrambi disattivati, ma vorremmo che non venissero visualizzati affatto.

qualche idea su come farlo?

nel caso in cui i miei termini non siano del tutto corretti, se guardi l'immagine nella Figura 3 del link sottostante, sulla più bassa delle tre barre degli strumenti c'è il grip a sinistra del menu a discesa ea destra di quella più a destra pulsante c'è l'overflow.

Immagine delle barre degli strumenti


Probabilmente potresti farlo sovrascrivendo il modello di controllo ... ma non lo consiglierei.
apandit

Puoi mettere Margin = "0,0, -14,0" sulla barra degli strumenti per spingere il lato destro fuori dalla vista. Questa è la soluzione più semplice che ho trovato, ma ho testato solo con una singola ToolBar non all'interno di un ToolBarPanel o di un ToolBarTray.
Wayne Bloss

Risposte:


153

Il grip può essere rimosso impostando la proprietà associata ToolBarTray.IsLocked="True"sulla barra degli strumenti.

Per rimuovere il ToggleButton di overflow , dovrai rimuoverlo in un ControlTemplate personalizzato come suggerisce sixlettervariables, che se hai blend o puoi scaricare l'anteprima di Blend 3 non è eccessivamente difficile.

Puoi anche nascondere il pulsante nell'evento caricato della ToolBar, sebbene qualunque sia il percorso che prendi, dovresti anche impostare la proprietà associata ToolBar.OverflowMode="Never"nel menu della ToolBar, in modo che gli elementi non possano traboccare accidentalmente in un'area irraggiungibile.

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

E imposta il ToggleButton di Overflow su compresso:

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

15
Fa sorgere la domanda: perché utilizzare una barra degli strumenti? Perché non utilizzare semplicemente un semplice StackPanel con pulsanti? Quali vantaggi offre la ToolBar?
Josh G

5
In risposta a Josh G: Se utilizzi un pulsante trasparente con un'immagine su un pannello normale (StackPanel ecc.) Avrà un contorno bianco. Quando lo stesso pulsante viene posizionato su una barra degli strumenti, il contorno bianco non è presente.
Chris Bennet

2
Ciò è utile anche se si desidera il tema di una barra degli strumenti in questo contesto, ad esempio il comportamento al passaggio del mouse.
Greg D

36
FYI: puoi utilizzare un semplice StackPanel e ottenere comunque lo stile della barra degli strumenti. <Button Style = "{StaticResource {x: Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </Image> </Button>
thrag

1
Inoltre ho scoperto che se non si desidera utilizzare il controllo <Menu> all'interno della barra degli strumenti, la proprietà ToolBar.OverflowMode = "Mai" può essere impostata direttamente all'interno del controllo <Button> nella barra degli strumenti. Questo ha creato l'effetto che stavo cercando
Ford

8

Puoi usare Blend piuttosto semplicemente sovrascrivere il ControlTemplate per ToolBarPanel, Menu o ToolBar.

  1. Fare clic con il tasto destro sulla barra degli strumenti e selezionare Modifica modello
  2. Da Modifica modello, seleziona Modifica una copia
  3. Consiglio di aggiungere la copia a un dizionario delle risorse
  4. Fare clic su OK

Ora modifichi il modello di controllo per ToolBarPanel e puoi impostare la visibilità su Collapsed per il segnale di grip e overflow. Puoi risciacquare e ripetere per gli altri controlli. Richiede un po 'di tempo, ma non è terribilmente difficile con Blend.


grazie per le informazioni. sfortunatamente blend2 e vs2008 non sembrano funzionare bene insieme per noi, troppi problemi quando si lavora con il codice generato nell'altro, quindi attualmente non lasciamo che blend si avvicini al nostro vs codice;)
Tom

1
Sì, abbiamo usato Blend in modo abbastanza religioso fino a quando non è uscito VS2k8SP1. In realtà mi auguro che l'editor WPF in VS2k8 WAS Blend. È molto più bello poter fare clic con il tasto destro su qualcosa e dire Raggruppa in "StackPanel" o "Border". Peccato che la SM voglia che siano esperienze diverse.
user7116

Penso che il nuovo XAML Power Toys aggiunga una funzionalità che ti consente di raggruppare i controlli. (Forse è il MoXAML Power Toys ...)
Numero8

8

È possibile "rimuovere" l'overflow senza fornire un nuovo modello di controllo impostando il ToolBarper avere margini destri negativi (e inserire un margine sinistro negativo in modo che non sembri strano con bordi sinistri arrotondati ma bordi destri quadrati). Quindi, aggiungi ClipToBounds="True"al ToolBarPanelche taglierà i bordi della barra degli strumenti che ora si attaccano all'esterno dell'area del pannello.

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

5

Piuttosto che nascondere completamente il pulsante di overflow, penso che sia meglio mostrarlo solo quando necessario. Questo può essere fatto legando la sua Visibilityproprietà alla sua IsEnabledproprietà:

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 stessa cosa può essere eseguita in XAML ridefinendo il modello)


3

Sto appena iniziando con WPF e non sono riuscito a ottenere nessuno dei metodi sopra per nascondere la mia freccia di overflow (Visual Studio 2010). L'unica cosa che sembrava influenzare la freccia era l'esempio Toolbar_Load sopra, ma tutto ciò che ha fatto è stato trasformare la freccia in uno spazio vuoto che sembrava brutto come la freccia. Il modo più semplice per capire era impostare i margini della barra degli strumenti.

<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>

0

I metodi sopra funzionano per nascondere l'overflow; Ho usato quanto segue per nascondere la pinza:

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

per un layout orizzontale e

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

per un layout verticale. Posiziona quanto sopra dopo la barra degli strumenti (o ToolbarTray, se lo usi)

Usa la larghezza e l'altezza necessarie per i tuoi pulsanti.

Kaxaml è eccellente per giocare con questa roba.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.