添加数据时 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 的高度会增加的主要内容,如果未能解决你的问题,请参考以下文章