在ListBox中,Wpf Datagrid列宽度失败

时间:2013-04-09 09:37:19

标签: wpf datagrid listbox

我有一个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>

有谁知道如何解决这个问题?

此致

3 个答案:

答案 0 :(得分:2)

根据sa_ddam213的建议,我发现了一个有效的kludge。 到目前为止我还没有其他想法。

我用ListView包装了DataGrid,从ListView中删除了所有“装饰”,并将 GridViewColumn 的宽度绑定到ListView的ActualWidth。也许ListView以外的一些控件也可以工作。我正在玩ListView。简单的边框不起作用。

边缘必须以某种方式进行调整,右边有一个空隙我没有摆脱(但我可以忍受它)。除非我禁用DataGrid的Horizo​​ntalScrollBarVisibility,否则在用鼠标拖动窗口宽度时会出现奇怪的闪烁鬼水平滚动条。

所以这里的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}}向右走。

结果:

enter image description here

答案 2 :(得分:0)

宽度=“自动”将解决问题。您还可以指定“MaxWidth”来限制列宽扩展。

      <DataGrid.Columns>
                <DataGridTextColumn Header="Column1"/>
                <DataGridTextColumn Header="Column2" Width="Auto" MaxWidth="200" />
                <DataGridTextColumn Header="Column3"/>
      </DataGrid.Columns>

希望这会有所帮助。