Search code examples
c#wpfheightwpfdatagrid

Height of WPF DataGrid increases when data added


I have a WPF DataGrid that increases in height when I add data to it that won't fit inside its initial height. I don't want the height to change unless the user increases the Window size. Is there a way to stop this auto-resize?

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

Solution

  • If I don't get you wrong, you want your DataGrid to be in centain Height initally, with some Empty Space below the DataGrid within the Windows...Then when resize the Window, the DataGrid will changes it size.

    Add one more Row to the Grid, and define a MinHeight of that Row. Then set DataGrid to be VerticalAlignment = Stretch. Also set a default height size for the Window.

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