如何使WPF数据网格中的最后一列占用所有左侧空格,总是?

gre*_*man 28 wpf datagrid

标准WPF 4 Datagrid.

假设我有200像素宽的数据网格和2列.我希望列总是占用整个空间,这意味着如果用户将第一列调整为50像素,则最后一列将为150.

最初我为第1列设置宽度为100像素,为最后一列设置*(在XAML中).

我认为问题在于删除虚拟的第3列,如下所述:

http://wpf.codeplex.com/Thread/View.aspx?ThreadId=58939

但实际上没有区别 - 仍然,当调整列的大小时,我在右边获得了一些额外的空间 - 使用虚拟列,它是一个虚拟列(默认为白色),没有它,它是空的空间(灰色的默认).

问题:如何强制执行约束,无论用户如何调整列的大小,

sum(columns width)==datagrid width
Run Code Online (Sandbox Code Playgroud)

编辑

是的,我使用WPF 4.

替代方法

我将其中一个答案标记为解决方案,但实际上它并不是WPF设计的解决方案.它只是WPF最多可以做的事情,它并不是很好 - 首先,列的选项CanUserResize实际上是IsResizeable,当打开时这个选项与Width设置为*相矛盾.因此,如果没有一些非常聪明的技巧,你最终会:

  • datagrid表示最后一列表面可调整大小,但事实上它不是,右边的空间很小(即虚拟列不可调整大小) - 最后一列:CanUserResize = true,Width =*

  • datagrid哪个最后一列不能被用户调整,并且相应地显示,最初没有显示右边的空格,但是当用户调整datagrid的任何元素时可以显示 - 对于最后一列:CanUserResize = false,Width =*

到目前为止,我可以看到WPF datagrid的两个问题:

  • 误导性的命名
  • 矛盾的特征

我仍然很清楚如何真正解决这个问题.

Bab*_*fas 21

将数据网格的宽度设置为"自动".您允许列在网格本身内正确调整大小,但您已将宽度硬连接到200.

更新:根据@ micas的评论,我可能会误读.如果是这种情况,请尝试使用100表示​​左列的宽度,使用100*表示右列(注意星号).这会将右列的宽度默认为100,但允许它调整大小以填充网格.


bij*_*iju 6

您可以在代码上设置列宽为星号.在构造函数中,添加:

    Loaded += (s, e) => dataGrid1.Columns[3].Width =
new DataGridLength(1, DataGridLengthUnitType.Star);
Run Code Online (Sandbox Code Playgroud)