标准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的两个问题:
我仍然很清楚如何真正解决这个问题.
如果我使用"*"设置DataGrid(位于RowDetailesTemplate)列的宽度 - 列缩放不起作用
<DataGrid>
...
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid Margin="10" Height="100">
<DataGrid.Columns>
<DataGridTextColumn Header="header A" Width="3*" />
<DataGridTextColumn Header="header B" Width="2*" />
<DataGridTextColumn Header="header C" Width="*" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

但是如果我用Grid替换DataGrid并使用"*"scailing works设置它的列宽
<Grid Margin="5" Height="100">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="header A" Background="LightGray" TextAlignment="Center" HorizontalAlignment="Stretch"></TextBlock>
<TextBlock Text="header B" Grid.Column="1" TextAlignment="Center" HorizontalAlignment="Stretch"></TextBlock>
<TextBlock Text="header C" Grid.Column="2" Background="LightGray" TextAlignment="Center" HorizontalAlignment="Stretch"></TextBlock>
</Grid>
Run Code Online (Sandbox Code Playgroud)

如何修复DataGrid缩放?
解:
<DataGrid HorizontalScrollBarVisibility="Disabled">
...
<DataGrid.RowDetailsTemplate>
...
</DataGrid.RowDetailsTemplate>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)