Wpf 网格列不应根据其子项进行拉伸

Wpf Grid column shouldn't stretch according to its child item

在正常情况下,网格列遵循其定义的宽度(通过 ColumnDefinition)。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="4*" />
        <ColumnDefinition Width="4*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <TextBlock Grid.Column="0" Grid.Row="0" Text="Column1Value Column1Value Column1Value" Background="Red"/>
    <TextBlock Grid.Column="1" Grid.Row="0" Text="Column2Value" Background="Yellow"/>
    <TextBlock Grid.Column="2" Grid.Row="0" Text="Column3Value" Background="Green"/>
    <TextBlock Grid.Column="0" Grid.Row="1" Text="Column1Value Column1Value Column1Value" Background="Red"/>
    <TextBlock Grid.Column="1" Grid.Row="1" Text="Column2Value" Background="Yellow"/>
    <TextBlock Grid.Column="2" Grid.Row="1" Text="Column3Value" Background="Green"/>
</Grid>

Column-0 内容被裁剪以符合网格宽度定义。 到目前为止一切都很完美。

但是如果我在 ListView 中使用 Grid 作为 ItemTemplate,如下所示

<ListView>
    <ListView.ItemsSource>
        <x:Array Type="{x:Type system:String}">
            <system:String>DemoPurposeItem1</system:String>
            <system:String>DemoPurposeItem2</system:String>
        </x:Array>
    </ListView.ItemsSource>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="2*" />
                    <ColumnDefinition Width="4*" />
                    <ColumnDefinition Width="4*" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="Column1Value Column1Value Column1Value" Background="Red"/>
                <TextBlock Grid.Column="1" Text="Column2Value" Background="Yellow"/>
                <TextBlock Grid.Column="2" Text="Column3Value" Background="Green"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

Column-0 内容未剪裁。 Column-0 开始根据其内容进行拉伸。

为什么 Grid 在 ListView 中使用时表现不同。我希望我的网格遵守其定义的宽度 (2*)。

注意:我必须使用 Grid 作为 ListView 的 ItemTemplate,我无法更改此结构。

Why Grid behave differently when its used inside ListView.

因为模板中Grid可用的space默认是无限的

如果您设置内部 GridWidth,星号调整将按预期工作。

例如,您可以使用绑定将其设置为 ListViewWidth

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid Width="{Binding ActualWidth,RelativeSource={RelativeSource AncestorType=ListView}}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="2*" />
                <ColumnDefinition Width="4*" />
                <ColumnDefinition Width="4*" />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" Text="Column1Value Column1Value Column1Value" Background="Red"/>
            <TextBlock Grid.Column="1" Text="Column2Value" Background="Yellow"/>
            <TextBlock Grid.Column="2" Text="Column3Value" Background="Green"/>
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

您可能需要使用转换器来稍微减小该宽度。无论如何,这里的关键是以某种方式限制可用宽度。