2009-06-26 15 views
83

In un nidificato WPF ToolBarPanel-toolbar-Menu vogliamo sbarazzarsi della maniglia della presa a sinistra e l'area di overflow verso destra. sono entrambi in grigio, ma vorremmo che non venissero visualizzati.WPF ToolBar: come rimuovere la presa e troppo pieno

qualche idea su come realizzarlo?

nel caso in cui i miei termini non siano del tutto corretti, se si guarda l'immagine nella Figura 3 del link sottostante, nella parte inferiore delle tre barre degli strumenti c'è il grip a sinistra del menu a discesa e alla destra di il pulsante più a destra c'è l'overflow.

Image of toolbars

+0

Probabilmente si potrebbe fare sovrascrivendo il modello di controllo .. ma non lo raccomanderei. – apandit

+0

È possibile impostare Margine = "0,0, -14,0" sulla barra degli strumenti per allontanare il lato destro. Questa è la soluzione più semplice che ho trovato, ma ho provato solo con una sola barra degli strumenti non all'interno di ToolBarPanel o ToolBarTray. –

risposta

128

L'impugnatura può essere rimosso impostando la proprietà associata ToolBarTray.IsLocked="True" sulla barra.

Per rimuovere il Overflow ToggleButton, sarà necessario rimuoverlo in un ControlTemplate personalizzata come sixlettervariables suggerisce che se si dispone di miscela o scaricare l'anteprima Blend 3 non è eccessivamente difficile.

Si potrebbe anche solo nascondere il pulsante nel caso in carica della barra degli strumenti, anche se a seconda di quale strada prendere, si dovrebbe anche impostare la proprietà associata ToolBar.OverflowMode="Never" nel menu della barra degli strumenti, in modo che gli oggetti non possono accidentalmente troppo pieno in una zona 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 impostare l'Overflow ToggleButton per crollato:

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

Inizia la domanda: perché usare una barra degli strumenti? Perché non usare semplicemente un semplice StackPanel con pulsanti? Che vantaggio fornisce la barra degli strumenti? –

+3

In risposta a Josh G: Se si utilizza un pulsante trasparente con un'immagine su un pannello normale (StackPanel ecc.) Avrà un contorno bianco. Tuttavia, quando lo stesso pulsante viene posizionato su una barra degli strumenti, il contorno bianco non è presente. –

+1

Ciò è utile anche se si desidera il tema di una barra degli strumenti in questo contesto, ad es. il comportamento del mouseover. –

8

È possibile use Blend to rather simply override the ControlTemplate per il ToolBarPanel, menu o barra degli strumenti.

  1. Fare clic destro sulla barra degli strumenti e selezionare Modifica modello
  2. Da Modifica modello, selezionare Modifica copia
  3. vi consiglio di aggiungere la copia a un dizionario risorse
  4. Fare clic su Ok

È Ora modificherò il modello di controllo per ToolBarPanel e potremo impostare la visibilità su Collapsed per il segnale di grip e di overflow. È possibile sciacquare e ripetere per gli altri controlli. È un po 'dispendioso in termini di tempo, ma non è terribilmente difficile con Blend.

+0

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 permettiamo che il blend si avvicini al nostro codice vs;) – Tom

+1

Sì, abbiamo usato Blend in modo equo religiosamente fino a quando VS2k8SP1 è venuto intorno. In realtà, mi piacerebbe che l'editor WPF di VS2k8 WAS Blend. È molto più bello poter fare clic con il pulsante destro del mouse su qualcosa e dire Raggruppa in "StackPanel" o "Bordo". Peccato che la MS voglia che siano esperienze diverse. – user7116

+0

Penso che i nuovi XAML Power Toys aggiungano una funzione che consente di raggruppare i controlli. (Forse è il MoXAML Power Toys ...) – Number8

0

I metodi di cui sopra lavoro per nascondere il troppo pieno; Ho usato il seguente 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. Posizionare il sopra dopo la barra degli strumenti (o ToolbarTray, se si utilizza quello)

Usare qualsiasi larghezza e l'altezza è necessario per i pulsanti.

Kaxaml è eccellente per giocare con questa roba.

2

sto solo agli inizi con WPF e non poteva ottenere qualsiasi dei metodi di cui sopra per nascondere la mia trabocco freccia (Visual Studio 2010).L'unica cosa che sembrava influenzare la freccia era l'esempio di Toolbar_Load sopra, ma tutto ciò che è stato fatto è stato trasformare la freccia in uno spazio vuoto che sembrava cattivo come la freccia. Il modo più semplice che potevo immaginare era solo quello di 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> 
+2

Nessuno funziona per me. Visual Studio 2015 –

3

È possibile "rimuovere" il troppo pieno senza fornire un nuovo modello di controllo impostando il ToolBar di avere margini destro negativi (e gettare in un margine sinistro negativo in modo che non sembra strano con bordi arrotondati sinistra ma Square bordi giusti). Quindi, aggiungere ClipToBounds="True" allo ToolBarPanel che taglierà i bordi della barra degli strumenti che ora si trovano 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"> 
    . . . 
3

Invece di nascondere completamente il pulsante di overflow, penso che sia meglio mostrarlo solo quando necessario. Questo può essere fatto legando la sua proprietà Visibility alla sua proprietà 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 stessa cosa può essere fatto in XAML ridefinendo il modello)

Problemi correlati