2012-06-12 21 views
6

Tengo un WGD DataGrid que aumenta en altura cuando agrego datos que no caben dentro de su altura inicial. No deseo que la altura cambie a menos que el usuario aumente el tamaño de la ventana. ¿Hay alguna manera de detener este cambio de tamaño automático?Altura de WPF DataGrid aumenta cuando se agregan datos

<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

Póngalo en una '' RowDefinition' que tiene Altura = "*" ' –

+0

probé este @Meleak pero no hace ninguna diferencia. – Ian

Respuesta

4

Si no lo malinterpreté, quiere que su DataGrid tenga una altura interior initally, con un espacio vacío debajo de la cuadrícula de datos dentro de Windows ... Luego, cuando cambie el tamaño de la ventana, la cuadrícula cambiará su tamaño.

Agregue una fila más a la cuadrícula y defina una MinHeight de esa fila. Luego configure DataGrid para que sea VerticalAlignment = Stretch. También establece un tamaño de altura predeterminado para la ventana.

<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

No del todo. Quiero que la altura del DataGrid sea independiente de la cantidad de filas que contiene, para mantener la misma altura en la vista de diseño. El usuario puede cambiar el tamaño de la Ventana que, según RowDefinitions, puede cambiar el tamaño de la fila de la Grilla.En ese caso, quiero que la altura de la GridView crezca con la altura de la Grilla. – Ian

+0

El código anterior es independiente de la cantidad de filas que contiene, DataGrid se mantendrá la misma altura hasta que el usuario cambie el tamaño de la ventana. La Fila uno (La que contiene DataGrid) usa la Altura restante que queda dentro de la Ventana. Digamos ahora que Window es 300, se usa 100 en 2nd Row, 200 se usará para DataGrid. Cuando el usuario cambie el tamaño de la ventana a 500, 400 se usará para DataGrid ... No importa cuántas filas contenga DataGrid, no aumentará su altura. –

+0

Lo siento, parece que cometí un error la primera vez que probé su solución. Esto parece funcionar. – Ian

0

Trate de usar VerticalAlignment = Top, por ejemplo, o explícitamente establecer la propiedad Height a algún valor.

This también podría ayudar ... colocar la cuadrícula de datos en un panel de distribución y controlar el comportamiento de dimensionamiento del panel de satck.

+0

Configuración VerticalAlignment = "Top" no ayuda. No quiero establecer Height explícitamente porque quiero que la grilla crezca cuando el usuario incremente el tamaño de la Ventana. Solo quiero que la altura sea como está antes de que se agreguen los datos. No estoy seguro de qué propiedades establecer en un StackPanel adjunto para lograr lo que quiero. – Ian

0

Si el problema es que toda la red está creciendo (pero le alegra que las filas individuales crezcan), entonces, ¿cuál es el panel principal en el que se encuentra DataGrid? Cambiar esto puede afectar la forma en que el control cambió de tamaño.

Por ejemplo: a StackPanel permitirá que sus hijos crezcan en una dirección (la dirección de apilamiento), y DockPanel limitará el tamaño del elemento "lleno" al espacio disponible.

+0

El tamaño de fila no está cambiando. Solo estoy mostrando texto. Intenté hacer que DataGrid fuera el elemento secundario de la ventana, de una cuadrícula y un DockPanel dentro de una cuadrícula. En todos los casos, DataGrid crece a un poco más que la altura de mi pantalla cuando agrego filas. – Ian

1

Esto va a hacer lo que deseo:

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

junto con esto:

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

El truco está en la distribución proporcional (incluso) de las alturas de las filas mediante el uso de "1 * "para las propiedades de Altura de ambas filas. También puede ditribute que en otras "acciones" mediante el establecimiento de una fila a la altura "2 *", etc.

1

que tenían el mismo problema, y ​​me fijo que por la simple eliminación SizeToContent = "WidthAndHeight" en la definición de la ventana .

+0

Hice lo que sugería la respuesta aceptada, pero no funcionó sin esto: obvio pero fácil de extrañar – stambikk

0
VerticalAlignment="Bottom" 

funcionó para mí para resolver exactamente el mismo problema. También utilicé

VerticalScrollBarVisibility="Auto"  
Cuestiones relacionadas