6

我有一个包含从 UserControl 派生的项目的 ListBox。具体的 UserControl 包含(除其他外)一个 DataGrid。基本上我无法更改具体的 UserControl(仅出于测试目的而更改;它的第三方类型)。一旦将一个列宽设置为“*”,所有列的 DataGrid 列宽就会被破坏,这是填充整个空间所必需的。

我可以用一个简化的例子来重现它(没有用户控件)。因此,如果我将 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>

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

问候

4

3 回答 3

2

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

我用 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>

不过,这只是一种解决方法。仍然欢迎任何合理的“修复”。

于 2013-04-09T12:57:46.673 回答
1

您可以将DataGrid宽度绑定回ListBox ActualWidth,这将给出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向右移动。

结果:

在此处输入图像描述

于 2013-04-09T11:21:11.920 回答
0

Width="Auto" 将解决问题。您还可以指定“MaxWidth”来限制列宽扩展。

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

希望这会有所帮助。

于 2013-04-09T10:19:11.790 回答