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

8

我有一个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;
        }
    }

将其放入 Height="*"RowDefinition 中。 - Fredrik Hedblad
我尝试了@Meleak,但是没有任何区别。 - Ian
7个回答

5

我曾遇到同样的问题,通过简单地在窗口定义中删除SizeToContent="WidthAndHeight"即可解决。


我按照被接受的答案建议所做的去尝试,但没有这个 - 这很明显但易于忽略。 - stambikk

5
如果我没理解错的话,您希望DataGrid最初具有固定的高度,并且在Windows中DataGrid下方有一些空白空间...当调整窗口大小时,DataGrid会改变其大小。
将Grid添加一行,并定义该行的MinHeight。然后将DataGrid设置为VerticalAlignment = Stretch。还要为窗口设置默认高度大小。
<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> 

1
不完全正确。我希望 DataGrid 的高度与它包含的行数无关,保持在设计视图中的相同高度。用户可能会更改窗口的大小,这可能会根据 RowDefinitions 改变 Grid 行的大小。在这种情况下,我希望 GridView 的高度随着 Grid 高度的增加而增加。 - Ian
以上的代码与行数无关,DataGrid 的高度会一直保持不变,直到用户重新调整窗口大小。第一行(包含 DataGrid 的那一行)将使用剩余窗口高度。比如说现在窗口高度是 300,第二行已经占用了 100,剩下的 200 将分配给 DataGrid。当用户将窗口大小调整为 500 时,DataGrid 将使用 400。无论 DataGrid 包含多少行,它的高度都不会增加。 - King Chan
抱歉,我在第一次测试您的解决方案时似乎犯了一个错误。但现在看来它确实有效。 - Ian
如果您不想要第二行(那些空白),您可以删除第二个RowDefinition。这里的重点是让您的DockPanel和DataGrid都能够延伸到窗口的高度,并确保您的窗口具有默认高度。如果这是您需要的答案,请将其标记为答案 :) - King Chan

1
这将实现您的需求:
<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 *”等来以其他“份额”进行分配。

0
 VerticalAlignment="Bottom" 

对我来说,这个完全相同的问题也起作用了。我也使用了

 VerticalScrollBarVisibility="Auto"     

0

尝试使用VerticalAlignment = Top或显式设置Height属性的某些值。

这个链接可能也有帮助,将DataGrid放在StackPanel中并控制StackPanel的大小行为。


1
设置VerticalAlignment="Top"没有帮助。我不想显式设置高度,因为我希望当用户增加窗口大小时,网格能够自动增长。我只想在添加数据之前保持高度不变。我不确定要在封闭的StackPanel上设置哪些属性才能实现我想要的效果。 - Ian

0
如果问题是整个网格都在增长(但您希望单独的行可以增长),那么:DataGrid所在的父面板是什么?更改这个可能会影响控件的调整大小方式。
例如:StackPanel将允许其子元素沿一个方向增长(堆叠方向),而DockPanel将限制“填充”元素的大小为可用空间。

行大小没有改变。我只是显示文本。我尝试将DataGrid作为Window、Grid和Grid内的DockPanel的子级。在所有情况下,当我添加行时,DataGrid都会增长到比我的屏幕高一点。 - Ian

0
这个答案可能有点晚了,但希望能对某些人有所帮助。创建一个名为“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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接