添加数据时,WPF 数据网格的高度会增加

本文关键字:数据 高度 增加 网格 数据网 WPF 添加 | 更新日期: 2023-09-27 18:36:57

我有一个 WPF 数据网格,当我向其添加不适合其初始高度的数据时,它的高度会增加。除非用户增加窗口大小,否则我不希望高度更改。有没有办法阻止这种自动调整大小?

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

添加数据时,WPF 数据网格的高度会增加

如果我没弄错的话,你希望你的数据网格最初处于中心高度,在窗口内的数据网格下方有一些空白区域......然后,当调整窗口大小时,数据网格将更改其大小。

再向网格添加一行,并定义该行的最小高度。 然后将"数据网格"设置为"垂直对齐=拉伸"。 还要设置窗口的默认高度大小。

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

我遇到了同样的问题,我通过简单地删除 SizeToContent="WidthAndHeight" 在窗口定义中修复了它。

这将执行您想要的操作:

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

除此之外:

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

诀窍在于行高的比例(均匀)分布,方法是对两行的高度属性使用"1*"。您也可以通过将一行高度设置为"2*"等来在其他"份额"中致敬。

如果问题是整个网格在增长(但你对个别行的增长感到高兴),那么:DataGrid 所在的父面板是什么? 更改此设置可能会影响控件调整大小的方式。

例如:StackPanel将允许其子元素沿一个方向(堆叠方向)增长,而DockPanel将"填充"元素的大小限制为可用空间。

 VerticalAlignment="Bottom" 

为我解决了这个完全相同的问题。我也用了

 VerticalScrollBarVisibility="Auto"     
例如,

尝试使用 VerticalAlignment = Top 或将 Height 属性显式设置为某个值。

这也可能有助于将数据网格放在堆栈面板中并控制堆栈面板的大小调整行为。

这个答案可能来晚了,但希望对某人有所帮助创建一个小方法"ResizeDataGrid"怎么样:

    Private void ResizeDataGrid (DataGrid myTable,double currentWindowSize){ 
// How much size would your datagrid occupy of total size , 1: full window
    var amountTakenofFullSize = 0.75;
    //Change the amount taken so it fits to ur content 
    If(windowSize>800)
     amountTakenofFullSize=0.85;

    mainTable.Height=currentWindowSize * amountTakenofFullSize;
    }
        
        
        

然后,您可以在加载窗口或更改大小时调用它使用参数调用该方法:

ResizeTable(myDataGrid,(neededWindow).RenderSize.Height);