添加数据时 WPF DataGrid 的高度会增加

Posted

技术标签:

【中文标题】添加数据时 WPF DataGrid 的高度会增加【英文标题】:Height of WPF DataGrid increases when data added 【发布时间】:2012-06-15 05:08:08 【问题描述】:

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

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

【问题讨论】:

把它放在一个有Height="*"RowDefinition 我试过这个@Meleak 但它没有任何区别。 【参考方案1】:

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

This 也可能有助于将 DataGrid 放入 StackPanel 并控制 StackPanel 的大小调整行为。

【讨论】:

设置 VerticalAlignment="Top" 没有帮助。我不想明确设置高度,因为我确实希望网格在用户增加窗口大小时增长。我只希望高度保持在添加数据之前的状态。我不确定要在封闭的 StackPanel 上设置哪些属性来实现我想要的。【参考方案2】:

如果问题是整个网格在增长(但您很高兴单个行增长),那么:DataGrid 所在的父面板是什么?更改它会影响控件调整大小的方式。

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

【讨论】:

行大小没有改变。我只是显示文字。我尝试让 DataGrid 成为 Window 的子节点、Grid 的子节点和 Grid 中的 DockPanel。在所有情况下,当我添加行时,DataGrid 都会增长到略高于屏幕高度。【参考方案3】:

如果我没有误会您的意思,您希望您的 DataGrid 最初处于中间高度,在 Windows 内的 DataGrid 下方有一些空白空间......然后在调整 Window 大小时,DataGrid 将更改它的大小。

向 Grid 中再添加一个 Row,并定义该 Row 的 MinHeight。然后将 DataGrid 设置为 VerticalAlignment = Stretch。还要为 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> 

【讨论】:

不完全。我希望 DataGrid 的高度独立于它包含的行数,以保持与设计视图中的高度相同。用户可以更改 Window 的大小,这可能会根据 RowDefinitions 更改 Grid 行的大小。在这种情况下,我希望 GridView 的高度与 Grid 高度一起增长。 以上代码与其包含的行数无关,DataGrid 将保持相同的高度,直到用户调整窗口大小。第一行(包含 DataGrid 的那一行)正在使用窗口内剩余的高度。现在说 Window 是 300,在第 2 行使用 100,200 将用于 DataGrid。当用户将窗口大小调整为 500 时,400 将用于 DataGrid...无论 DataGrid 包含多少行,它都不会增加它的高度。 对不起,我第一次测试您的解决方案时似乎出错了。这似乎确实有效。 如果您不想要第 2 行(那些空白区域),您可以删除第 2 行定义。这里重要的是让你的 DockPanel 和 DataGrid 都拉伸到窗口的高度。并让您的窗口具有默认高度。如果这是您想要的答案,请将其标记为答案 :)【参考方案4】:

这将满足您的要求:

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

诀窍在于通过对两行的 Height 属性使用“1*”来按比例(均匀)分布行高。您也可以通过将一行高度设置为“2*”等方式将其分配到其他“共享”中。

【讨论】:

【参考方案5】:

我遇到了同样的问题,我通过简单地删除 Window 定义中的 SizeToContent="WidthAndHeight" 来解决它。

【讨论】:

我按照公认答案的建议做了,但没有这个就不行 - 很明显但很容易错过【参考方案6】:
 VerticalAlignment="Bottom" 

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

 VerticalScrollBarVisibility="Auto"     

【讨论】:

以上是关于添加数据时 WPF DataGrid 的高度会增加的主要内容,如果未能解决你的问题,请参考以下文章

easyUi datagrid怎样设置行高度

手风琴高度问题中的WPF DataGrid

WPF DataGrid 如何动态设置单行高度

WPF DataGrid 双击行 获得绑定数据

WPF:关于ScrollViewer中嵌套Datagrid的问题

WPF DataGrid,处理键和无数据