2009-08-02 16 views
14

Ho qualche problema nel far funzionare questo in un'applicazione WPF su cui sto lavorando. Fondamentalmente, quello che sto cercando è qualcosa come il riquadro Attività in un MMC:Come attivare la visibilità della colonna Griglia WPF

  • L'app ha tre colonne nella parte principale del display. Ho bisogno di una colonna sul lato destro che sia ridimensionabile. Presumo che questo significhi usare una griglia con un GridSplitter ma qualsiasi cosa funzioni andrà bene.
  • Desidero poter salvare la larghezza della colonna di destra quando l'app è chiusa e caricarla quando l'app è aperta, ma questa dovrebbe essere una dimensione iniziale: l'utente dovrebbe essere in grado di ridimensionarla.
  • Quando ridimensiono la finestra, desidero che le colonne sinistra e destra mantengano la stessa dimensione e la colonna centrale per ridimensionare con la larghezza della finestra.
  • Le colonne sinistra e destra devono avere una larghezza minima. Quando ridimensiono la colonna di destra, voglio che la colonna centrale si riduca ma non la colonna di sinistra.
  • Voglio anche essere in grado di attivare la visibilità della colonna di destra con un pulsante di attivazione che si trova all'esterno della colonna e quando ritorna alla visibilità, voglio che abbia la stessa larghezza di prima.

Sto provando a fare il più possibile in XAML e con rilegatura.

E posso averlo sormontato con crema, gelato e gocce di cioccolato, per favore? :-)

+0

Ho modificato la domanda originale piuttosto pesantemente perché il mio originale era chiaro come il fango. – serialhobbyist

+0

La mia seconda taglia in dieci minuti. Dal momento che non ne ho ancora completato uno, non sono abbastanza sicuro di cosa accada. Suppongo che vedremo ... – serialhobbyist

+0

Se non ne scegli uno, la risposta più votata ottiene automaticamente –

risposta

16

Come ho letto le vostre esigenze, invece di pensare a un Grid, penso a un DockPanel.

<DockPanel> 
    <Grid Name="right" 
     DockPanel.Dock="Right" MinWidth="100" /> 
    <Grid Name="Left" 
     DockPanel.Dock="Left" MinWidth="100" /> 
    <Grid Name="middle" /> 
</DockPanel> 

Se si commette un modo per ridimensionare right, quindi middle cambierà come right viene ridimensionata. Se ridimensionate la finestra, cambierà solo middle. Memorizzare e impostare lo Width di right dipende da te, ma non dovrebbe essere difficile.

Come per consentire all'utente di ridimensionare right, che sarà un po 'più complicato, ma ho trovato this article che dovrebbe aiutare. potrebbe aiutare ancora di più.

per la visibilità di right, è possibile impostare la sua Visibility-Collapsed di nasconderlo e ripristinarlo impostandolo su Visible.

Nota: i pannelli all'interno non devono essere Grid s, ma si desidera utilizzare una sorta di Panel per ciascuno. Qualunque cosa tu abbia all'interno delle tue attuali colonne Grid dovrebbe funzionare bene.

+0

Ho usato il tuo approccio e gli articoli che hai suggerito e funziona come un fascino. Associo le proprietà Visibility sia del contenuto che dello splitter al pulsante di attivazione e tutto funziona come pianificato. Grazie mille per il tuo aiuto. – serialhobbyist

+0

Prego. –

4

Imposta la larghezza della colonna di larghezza su Auto e metti un controllo all'interno di quella colonna e assegna a Star le altre colonne. Ogni volta che vuoi nascondere la colonna con il contenuto, imposta il controllo.Visibilità = Compresso e poiché la larghezza della colonna è Auto, non vedrai quella colonna e le colonne rimanenti occuperanno lo spazio.

+0

Non riesco a farlo funzionare con il comportamento desiderato. Impostare la larghezza su Auto significa ridimensionare la finestra influisce sulle colonne in ciò che apparirebbe all'utente come modi non sensoriali. – serialhobbyist

7

Ho usato una griglia con GridSplitters poiché questo ha reso davvero facile ridimensionare la colonna centrale mantenendo le larghezze delle colonne sinistra e destra.

XAML:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="MainWindow" 
    Title="Main Window" 
    Width="640" Height="480"> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <!-- Left column --> 
       <ColumnDefinition Width="200" MinWidth="100"/> 
       <!-- Left GridSplitter column --> 
       <ColumnDefinition Width="5"/> 
       <!-- Center column. A width of * means the column will fill 
        any remaining space. --> 
       <ColumnDefinition Width="*"/> 
       <!-- Right GridSplitter column --> 
       <ColumnDefinition x:Name="RightSplitterColumn" Width="5"/> 
       <!-- Right column --> 
       <ColumnDefinition x:Name="RightColumn" Width="200" 
            MinWidth="100"/> 
       </Grid.ColumnDefinitions> 
       <GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" /> 
       <GridSplitter Grid.Column="3" HorizontalAlignment="Stretch" /> 
       <Button x:Name="ToggleButton" Grid.Column="2" 
         Content="Toggle Right Column" Width="150" Height="25" 
         Click="ToggleButton_Click" /> 
    </Grid> 
</Window> 

codice sottostante

Quando nascondere la colonna di destra, ho appena impostare la larghezza della colonna a 0 poiché le colonne della griglia non hanno una proprietà di visibilità.

public partial class MainWindow : Window 
{ 
    private double rightColumnWidth; 
    private double rightColumnMinWidth; 
    private bool rightColumnHidden; 

    public MainWindow() 
    { 
     this.InitializeComponent(); 
    } 

    private void ToggleButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (rightColumnHidden) 
     { 
      // Restore the widths. 
      RightColumn.MinWidth = rightColumnMinWidth; 
      RightColumn.Width = new GridLength(rightColumnWidth); 
      RightSplitterColumn.Width = new GridLength(5); 
     } 
     else 
     { 
      // Remember the user-set widths for the columns. 
      rightColumnWidth = RightColumn.Width.Value; 
      rightColumnMinWidth = RightColumn.MinWidth; 

      // Remember to set the minimum width to 0 before changing the actual 
      // width. 
      RightColumn.MinWidth = 0; 
      RightColumn.Width = new GridLength(0); 
      RightSplitterColumn.Width = new GridLength(0); 
     } 

     rightColumnHidden = !rightColumnHidden; 
    } 
} 

Per quanto riguarda il salvataggio e il ripristino la larghezza delle colonne all'avvio, vorrei solo memorizzare le variabili di larghezza per un file di impostazioni e quindi applicare quando la vostra applicazione viene riaperto.

+0

Grazie per il suggerimento: realizza ciò che volevo, quindi l'ho "aumentato", ma penso che questo tipo di cose sia meglio fatto in XAML con il binding ovunque sia possibile. Ho accettato la risposta di Joel perché è più vicina a questo approccio. Grazie ancora per il tuo lavoro. – serialhobbyist

Problemi correlati