WPF中DataGrid列宽在ListBox中失效。

6
我有一个包含UserControl项的ListBox。具体的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个回答

2

根据sa_ddam213的建议,我找到了一个可行的方法。

我将DataGrid包装在ListView中,从ListView中删除了所有“装饰”,并将GridViewColumn的宽度绑定到ListView的ActualWidth上。可能也有一些控件可以使用,我只是在尝试ListView。简单的边框不起作用。

必须调整边距,并且右侧有一个间隙,我无法摆脱(但我可以忍受它)。除非禁用DataGrid的HorizontalScrollBarVisibility,否则在使用鼠标拖动窗口宽度时会出现奇怪的闪烁幽灵水平滚动条。

因此,以下是似乎足够的XAML代码。 请注意,实际的ListView修补程序将成为具体的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
你可以将 DataGrid 的宽度绑定回 ListBoxActualWidth,这将为 DataGrid 提供一个实际的大小而不是 Auto,这样 * 大小调整应该会起作用。
<!-- 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的内容和边缘之间存在一些间距,您可能需要微调Margin(就像我上面所做的那样)以避免DataGrid向右移动。

enter image description here


这是一个有前途的方法。不幸的是,它只在我的简单示例中有效。正如我所提到的,实际的DataGrid位于UserControl的“某个地方”。事实上,它是Grid的一部分,该Grid是Expander的一部分,并缩进了一些像素。因此,ItemPresenter的ActualWidth不是DataGird所需的宽度,我不能对差异做出任何假设。所以我尝试将DataGrid嵌套到另一个Grid中,并将宽度绑定到该Grid的ActualWidth。当扩大窗口时,它运行良好,但是当缩小窗口时,DataGrid不再收缩。 - user2261015

0

Width="自动" 将解决问题。您还可以指定 'MaxWidth' 限制列宽扩展。

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

希望这能有所帮助。

很抱歉,这样做不行。Width="Auto" 将根据内容进行调整,而 "*" 将 扩展 到可用空间。我需要后者。此外,如果未指定 Width,则 Width="Auto" 是默认值 - 据我所知。因此,Width="Auto" 将与我示例中的第一个 ListBoxItem 相同。 - user2261015

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接