我有一个ListBox,其中包含从UserControl派生的项目。具体的UserControl包含(以及其他)DataGrid。基本上我不能改变具体的UserControl(仅为测试目的而改变;它的第三方类型)。一旦列宽设置为“*”,所有列的DataGrid列宽就会被破坏,这是填充整个空间所必需的。
我可以用简化的例子(没有UserControl)重现它。因此,如果我将DataGrid添加为ListBoxItem,则指定列宽为“*”会破坏列宽。顺便说一句,这些列也不能再由用户调整大小。
简单示例:
<Window x:Class="DataGridSpike.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox HorizontalContentAlignment="Stretch" >
<!-- Column width is basically ok but only since not "*" -->
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Column1"/>
<DataGridTextColumn Header="Column2"/>
<DataGridTextColumn Header="Column3"/>
</DataGrid.Columns>
</DataGrid>
<!-- Broken column width: -->
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Column1"/>
<DataGridTextColumn Header="Column2" Width="*"/>
<DataGridTextColumn Header="Column3"/>
</DataGrid.Columns>
</DataGrid>
</ListBox>
</Grid>
有谁知道如何解决这个问题?
此致
答案 0 :(得分:2)
根据sa_ddam213的建议,我发现了一个有效的kludge。 到目前为止我还没有其他想法。
我用ListView包装了DataGrid,从ListView中删除了所有“装饰”,并将 GridViewColumn 的宽度绑定到ListView的ActualWidth。也许ListView以外的一些控件也可以工作。我正在玩ListView。简单的边框不起作用。
边缘必须以某种方式进行调整,右边有一个空隙我没有摆脱(但我可以忍受它)。除非我禁用DataGrid的HorizontalScrollBarVisibility,否则在用鼠标拖动窗口宽度时会出现奇怪的闪烁鬼水平滚动条。
所以这里的XAML似乎已经足够了。 请注意,实际的ListView kludge将成为具体UserControl的一部分。 但是,以下(简化)代码显示了我所做的:
<Window x:Class="DataGridSpike.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox HorizontalContentAlignment="Stretch">
<!-- ListView is just a kludge -->
<ListView HorizontalContentAlignment="Stretch" Padding="-4,2,-10,0" BorderThickness="0">
<ListView.View>
<GridView>
<GridView.ColumnHeaderContainerStyle>
<Style>
<Setter Property="FrameworkElement.Visibility" Value="Collapsed"/>
</Style>
</GridView.ColumnHeaderContainerStyle>
<GridViewColumn Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" />
</GridView>
</ListView.View>
<DataGrid HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch"
Padding="-2,0" HorizontalScrollBarVisibility="Disabled">
<DataGrid.Columns>
<DataGridTextColumn Header="Column1"/>
<DataGridTextColumn Header="Column2" Width="1*" />
<DataGridTextColumn Header="Column3" />
</DataGrid.Columns>
</DataGrid>
</ListView>
</ListBox>
</Grid>
</Window>
尽管如此,这只是一种解决方法。任何合理的“修复”仍然受到欢迎。
答案 1 :(得分:1)
您可以将DataGrid
宽度绑定回ListBox
ActualWidth
,这将为DataGrid
提供Auto
以外的实际尺寸和{{ 1}}大小调整应该有效。
*
然而,由于<!-- Broken column width: -->
<DataGrid Width="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsPresenter}}}" Margin="-2,0,0,0">
<DataGrid.Columns>
<DataGridTextColumn Header="Column1"/>
<DataGridTextColumn Header="Column2" Width="*"/>
<DataGridTextColumn Header="Column3"/>
</DataGrid.Columns>
</DataGrid>
的内容和边缘之间存在一些间距,您可能需要稍微调整ListBox
(就像我上面所做的那样)以避免{ {1}}向右走。
结果:
答案 2 :(得分:0)
宽度=“自动”将解决问题。您还可以指定“MaxWidth”来限制列宽扩展。
<DataGrid.Columns>
<DataGridTextColumn Header="Column1"/>
<DataGridTextColumn Header="Column2" Width="Auto" MaxWidth="200" />
<DataGridTextColumn Header="Column3"/>
</DataGrid.Columns>
希望这会有所帮助。