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默认是无限的
如果您设置内部 Grid
的 Width
,星号调整将按预期工作。
例如,您可以使用绑定将其设置为 ListView
的 Width
:
<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>
您可能需要使用转换器来稍微减小该宽度。无论如何,这里的关键是以某种方式限制可用宽度。
在正常情况下,网格列遵循其定义的宽度(通过 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默认是无限的
如果您设置内部 Grid
的 Width
,星号调整将按预期工作。
例如,您可以使用绑定将其设置为 ListView
的 Width
:
<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>
您可能需要使用转换器来稍微减小该宽度。无论如何,这里的关键是以某种方式限制可用宽度。