标准WPF 4数据网格。
假设我有一个200像素宽的数据网格,有两列。我想列总是整个空间,这意味着如果用户调整第一列的大小为50像素,最后一个将是150。
最初我为第一列设置宽度100像素,为最后一列设置 *(在XAML中)。
我认为问题在于删除虚拟的第三列,如下所述:
http://wpf.codeplex.com/Thread/View.aspx?ThreadId=58939
但实际上没有什么区别--尽管如此,在调整列的大小时,我在右边得到了一些额外的空间--有了虚拟列,它是一个虚拟列(默认为白色),没有它,它是空的空间(默认为灰色)。
问题:如何强制约束,即无论用户如何调整列的大小,
sum(columns width)==datagrid width
?
编辑
是的,我使用WPF 4。
变通办法
我将其中一个答案标记为解决方案,但实际上由于WPF设计,它不是解决方案。这就是WPF所能做的最好的事情,它不是很好-首先,列的CanUserResize选项意味着IsResizeable,并且该选项在打开时与Width设置为 * 相矛盾。所以如果没有一些真正聪明的技巧,你最终会得到:
- 最后一列表面上可调整大小但实际上不可调整大小的数据网格,并且示出了右侧的小空间(即,虚拟列不可调整大小)--对于最后一列:CanUserResize=true,Width=*
- datagrid的最后一列不能由用户调整大小,它相应地显示,最初右边没有空间显示,但当用户调整datagrid的任何元素的大小时,它可以显示--对于最后一列:CanUserResize=false,Width=*
到目前为止,我可以看到WPF datagrid的两个问题:
- 误导性命名
- 特征矛盾
我仍然全神贯注于如何真正解决这个问题。
8条答案
按热度按时间2j4z5cfb1#
将数据网格的宽度设置为“自动”。您允许列在网格本身内正确调整大小,但将宽度硬连接为200。
ie3xauqp2#
可以设置列宽以在代码上加星星。在构造函数中,添加:
qltillow3#
我只是将其实现为一个附加行为。问题是,当您将DataGrid的最后一列设置为 * 时,它确实会调整大小以适应,但其他单元格的所有自动调整都会出错。为了解决这个问题,附加的行为对其他(非最后一个)单元格进行手动自动拟合。
这也适用于调整其他列的大小-一旦加载,您可以调整大小,最后一列将始终填充。请注意,此行为只在Loaded事件上起作用一次
webghufk4#
预先警告:这是一个黑客....
我注册到Dr. ABT类的“OnLastColumnFillChanged”方法中的“AutoGeneratedColumns”事件,并将Loaded方法复制到其中,它可以工作。我还没有完全测试过,所以YMMV。
我的零钱:
对了,别忘了将名称空间添加到XAML声明中!:)
上一页:
然后在DataGrid声明中:
更新:我说里程会有变化!我的的确如此。
整个“autofit columns”位导致我的DataGrid中的一些列的列数可变,只有列标题那么宽。我删除了这一部分,现在它似乎可以处理应用程序中的所有DataGrid。
现在我有:
yhqotfr85#
这里有一个非常简单的答案,所有这些都在代码后面执行。:-)所有列将自动调整大小;最后一列将填充所有剩余空间。
gxwragnw6#
我可能会晚一点,但你可以试试我的代码从这个问题。我扩展了原始网格并添加了最后一列拉伸的方法:
其中
ViewPortWidth
是:因此,您必须找到
DataGridColumnHeadersPresenter
类型的可视子元素(答案来自here),它具有视口的宽度并计算最后一列的宽度。要自动执行此操作,可以在LayoutUpdated
事件上触发此方法。此外,您可以添加DependencyProperty
,指示是否应执行最后一列的自动拉伸。f8rj6qna7#
基于pennyrave给DR.ABT's answer的更新,我做了进一步的更新,以使其更好地工作。这仍然是一个技巧,但当我不断更新DataGrid的ItemsSource属性时,它似乎比他们的任何一个答案都更有效。如果我尝试在任何地方使用星星或自动宽度,WPF坚持所有列都只有20像素宽,所以我根据它们设置的自动值对它们进行硬编码。
我向AutoGeneratedColumns事件添加了一个调用,使其延迟一点。如果没有这个延迟,所有列都坚持它们只有20个像素宽。他们有时仍然这样做,但我已经检查了,它似乎工作,(但列呈现错误,然后在一毫秒后纠正。)
理想情况下,我们应该在WPF计算出自动大小之后,在呈现DataGrid之前应用列大小,但是我找不到任何方法让我的代码在那里运行。不是太早就是太晚。
记住在xaml顶部的窗口标记中添加类似
xmlns:Util="clr-namespace:MyProject.Util"
的内容,然后就可以在DataGrid标记中使用Util:DataGridExtensions.LastColumnFill="True"
了。pkln4tw68#
对于最后一列,设置
Width="*"
并覆盖MaxWidth
,例如覆盖为MaxWidth="2000"
。