2013-07-26 13 views
10

Ho un problema con ScrollViewer che utilizzo per scorrere un controllo utente che contiene una griglia di dati. Senza il visualizzatore di scroll, le colonne riempiono la griglia di dati come voglio ma quando si aggiunge un visualizzatore di scroll le colonne si riducono a ~ 15px. Sono stato in grado di semplificare il mio layout e posso ancora riprodurre questo comportamento.ScrollViewer di WPF attorno a DataGrid influisce sulla larghezza della colonna

Quando si assegna la larghezza del datagrid a un altro controllo, le colonne hanno il loro normale con, ma questo ha senza scandalo lo stesso effetto di una larghezza fissa sul datagrid. Immagino di non essere il primo ad avere questo problema. Come posso aggirare questo comportamento per avere la mia griglia che adatta le sue dimensioni allo spazio disponibile e dare alle colonne una larghezza propositiva?

Con ScrollViewer: enter image description here e senza: enter image description here

<Window x:Class="GridTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<ScrollViewer HorizontalScrollBarVisibility="Auto"> 
<Grid MinWidth="200"> 
    <DataGrid Margin="0" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Header="Column A" Width="*"/> 
      <DataGridCheckBoxColumn Header="Column B" Width="*"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
</ScrollViewer> 

+0

Hai provato questo:

+0

Sì, stesso risultato purtroppo. – Jay

+2

Rimuovi HorizontalScrollBarVisibility = "Auto" e provalo. –

risposta

14

Sì, ho avuto questo problema qualche tempo fa, ho fatto ricorso ad una soluzione, mi post qui solo in caso il suo utile

<ScrollViewer HorizontalScrollBarVisibility="Auto"> 
    <Grid x:Name="grid" MinWidth="200"> 
     <DataGrid Width="{Binding ElementName=grid, Path=ActualWidth}"> 
      <DataGrid.Columns> 
       <DataGridCheckBoxColumn Header="Column A" Width="1*"/> 
       <DataGridCheckBoxColumn Header="Column B" Width="1*"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</ScrollViewer> 

Il trucco era dare il DataGrid una larghezza, in questo caso ho legato di nuovo alla elemento che contiene

O se non si utilizza il HorizontalScrollBar è possibile disabilitarlo, questo permetterà al ScrollViewer per calcolare una larghezza che consente il controllo DataGrid per calcolare una larghezza.

+1

La griglia viene ridimensionata quando ridimensiono la larghezza della finestra ma solo quando viene aumentata la larghezza. Qualche idea su come ridimensionare la griglia quando viene ridotta anche la larghezza della finestra? – mardok

+0

Grazie per questo bell'esempio di come correggere un po 'di XAML usando XAML. ^^ – Hardryv

+0

Questa soluzione proposta si blocca su VS2010 :-) Sembra un bug – juFo

0

Ho vissuto la stessa cosa la scorsa settimana.

In genere, questo problema si verifica quando si hanno i seguenti elementi:

  1. Un DataGrid senza larghezza collocato all'interno di un ScrollViewer con la HorizontalScrollBarVisibility proprietà impostata a Auto
  2. Almeno un DataGridColumn ha una larghezza illimitata/non definito (ad esempio: Width="*")


In realtà, la soluzione dipende dalle vostre esigenze:

  • O volete che il vostro DataGridColumns a prendere tutto lo spazio disponibile del vostro DataGrid quando la finestra sta mostrando (anche se non c'è visualizzati i dati): in questo caso, sa_ddam213 's la risposta può aiutarti a far fronte.
  • Oppure non ti dispiace avere degli spazi vuoti tra l'ultima colonna e il bordo destro dello DataGrid sul primo spettacolo di Windows.

Per l'ultima opzione, è sufficiente impostare la larghezza fissa per la DataGridColumns (o semplicemente non definirlo se non si vuole, questo non è molto importante in quanto le colonne possono essere facilmente ridimensionati dalla utente tramite un doppio clic). In questo contesto, il tuo DataGrid può essere definito senza larghezza.


Ecco un esempio:

<ScrollViewer HorizontalScrollBarVisibility="Auto"> 
    <Grid x:Name="grid" MinWidth="200"> 
     <DataGrid> 
      <DataGrid.Columns> 
       <DataGridCheckBoxColumn Header="Column A" Width="100"/> 
       <DataGridCheckBoxColumn Header="Column B" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</ScrollViewer> 


In questo modo, se un contenuto di colonna corre sopra il contenitore dopo una colonna di auto-ridimensionamento, viene visualizzata una barra di scorrimento orizzontale.