2012-06-12 14 views
6

Ho un DataGrid WPF che aumenta di altezza quando aggiungo dati che non rientrano nella sua altezza iniziale. Non voglio che cambi l'altezza a meno che l'utente non aumenti le dimensioni della finestra. C'è un modo per fermare questo ridimensionamento automatico?L'altezza del WPF DataGrid aumenta quando i dati sono stati aggiunti

<Window x:Class="WpfDataGridSizeTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Loaded="Window_Loaded" 
     SizeToContent="WidthAndHeight"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <DockPanel Grid.Row="0"> 
      <DataGrid x:Name="wordsDataGrid" VerticalAlignment="Top" ItemsSource="{Binding}" MinHeight="100" SelectionMode="Single" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Column" Width="Auto" Binding="{Binding AString}"/> 
       </DataGrid.Columns> 
      </DataGrid> 
     </DockPanel> 
    </Grid> 
</Window> 

    public partial class MainWindow : Window 
    { 
     MyList myList = new MyList(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      wordsDataGrid.DataContext = myList; 
      for (int i = 0; i < 100; ++i) 
      { 
       myList.AddOne("blah blah"); 
      } 
     } 
    } 

    public class MyList : ObservableCollection<AClass> 
    { 
     public MyList() { } 

     public void AddOne(string aString) 
     { 
      base.Add(new AClass(aString)); 
     } 
    } 

    public class AClass 
    { 
     public string AString { get; set; } 

     public AClass(string aString) 
     { 
      AString = aString; 
     } 
    } 
+0

Mettetela in un 'RowDefinition' che ha' height = "*" ' –

+0

Ho provato questo @Meleak ma non fa alcuna differenza. – Ian

risposta

4

Se non ti sbaglio, vuoi che il tuo DataGrid sia in centain Altezza inziale, con un po 'di spazio vuoto sotto il DataGrid all'interno di Windows ... Poi quando ridimensiona la finestra, il DataGrid cambia le sue dimensioni.

Aggiungere un'altra riga alla griglia e definire un valore MinHeight di tale riga. Quindi imposta DataGrid come VerticalAlignment = Stretch. Imposta anche una dimensione altezza predefinita per la finestra.

<Window x:Class="WpfDataGridSizeTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Loaded="Window_Loaded" Height="300"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition MinHeight="100"/> 
     </Grid.RowDefinitions> 
     <DockPanel Grid.Row="0" VerticalAlignment="Stretch"> 
      <DataGrid x:Name="wordsDataGrid" VerticalAlignment="Stretch" ItemsSource="{Binding}" MinHeight="100" SelectionMode="Single" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Column" Width="Auto" Binding="{Binding AString}"/> 
       </DataGrid.Columns> 
      </DataGrid> 
     </DockPanel> 
    </Grid> 
</Window> 
+0

Non proprio. Voglio che l'altezza di DataGrid sia indipendente dal numero di righe che contiene, per mantenere la stessa altezza nella vista di progettazione. L'utente può modificare la dimensione della finestra che, a seconda di RowDefinitions, può modificare la dimensione della riga Grid.In tal caso voglio che l'altezza del GridView cresca con l'altezza della griglia. – Ian

+0

Il codice di cui sopra è indipendente dal numero di righe che contiene, il DataGrid rimarrà della stessa altezza fino a quando l'utente ridimensiona la finestra. La riga uno (quella che contiene DataGrid) utilizza l'altezza rimanente lasciata all'interno della finestra. Dire ora Window è 300, usato 100 in 2nd Row, 200 userà per DataGrid. Quando l'utente ridimensiona la finestra su 500, 400 verrà utilizzato per DataGrid ... Indipendentemente dal numero di righe che contiene il DataGrid, non aumenterà l'altezza. –

+0

Mi spiace, mi sembra di aver fatto un errore quando ho testato la soluzione per la prima volta. Questo sembra funzionare. – Ian

0

Prova utilizzando VerticalAlignment = Top per esempio o esplicitamente impostare la proprietà Height ad un certo valore.

This potrebbe anche aiutare ... inserire il datagrid in uno stackpanel e controllare il comportamento di dimensionamento del satckpanel.

+0

Impostazione VerticalAlignment = "Top" non aiuta. Non voglio impostare l'altezza in modo esplicito perché voglio che la griglia cresca quando la dimensione della finestra viene aumentata dall'utente. Voglio solo che l'altezza sia come prima che i dati vengano aggiunti. Non sono sicuro di quali proprietà impostare su un StackPanel che racchiude per ottenere ciò che voglio. – Ian

0

Se il problema è l'intera crescita della rete (ma sei contento che le singole righe crescano), allora: qual è il pannello principale in cui si trova DataGrid? La modifica di questa impostazione può influire sul modo in cui il controllo viene ridimensionato.

Per esempio: un StackPanel permetterà ai suoi bambini di crescere in una direzione (la direzione di impilamento), ed un DockPanel limiterà la dimensione dell'elemento "pieno" per lo spazio disponibile.

+0

La dimensione della riga non cambia. Sto solo visualizzando il testo. Ho provato ad avere DataGrid come figlio della finestra, di una griglia e di un DockPanel all'interno di una griglia. In tutti i casi il DataGrid cresce fino a poco più dell'elevata altezza del mio schermo quando aggiungo le righe. – Ian

1

Questo farà ciò che desideri:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*"/> 
     <RowDefinition Height="1*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="70"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 

    <DataGrid Name="dgMain" AutoGenerateColumns="True"></DataGrid> 

    </Grid> 

a fianco con questo:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     Foo foo; 
     List<Foo> foos = new List<Foo>(); 

     foo = new Foo() { Name = "Sjaak" }; 
     foos.Add(foo); 

     foo = new Foo() { Name = "Joepie" }; 
     foos.Add(foo); 

     dgMain.ItemsSource = foos; 

    } 
} 

public class Foo 
{ 
    public Foo() { } 

    public String Name { get; set; } 
} 

Il trucco sta nel proporzionale (anche) la distribuzione di l'altezza delle righe utilizzando "1 * "per le proprietà di altezza di entrambe le righe. È inoltre possibile ditribute in altre "azioni" impostando un'altezza della riga a "2 *", ecc

1

Ho avuto lo stesso problema e ho riparato semplicemente rimuovendo SizeToContent = "WidthAndHeight" nella definizione finestra .

+0

Ho fatto ciò che la risposta accettata ha suggerito ma non ha funzionato senza questo - ovvio ma facile da perdere – stambikk

0
VerticalAlignment="Bottom" 

ha funzionato per risolvere questo stesso identico problema. Ho anche usato

VerticalScrollBarVisibility="Auto"  
Problemi correlati