我有一个带有3列GridView的ListView。我希望最后一列占用ListView的剩余宽度。
答案 0 :(得分:26)
使用简单的XAML无法做到这一点,但有一些解决方案。看看这个:
答案 1 :(得分:8)
有一种方法可以使用行为模式
<ListView HorizontalAlignment="Stretch"
Behaviours:GridViewColumnResize.Enabled="True">
<ListViewItem></ListViewItem>
<ListView.View>
<GridView>
<GridViewColumn Header="Column *"
Behaviours:GridViewColumnResize.Width="*" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox HorizontalAlignment="Stretch" Text="Example1" />
</DataTemplate>
</GridViewColumn.CellTemplate>
请参阅以下链接以获取一些示例,并链接以阅读更多http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto
并查看源代码。查看 https://github.com/rolfwessels/lazycowprojects/tree/master/Wpf
答案 2 :(得分:8)
快速&amp;脏
XAML:
<ListView SizeChanged="ListView_SizeChanged" Loaded="ListView_Loaded" >
<ListView.View>
<GridView>
<GridViewColumn Header="col1" Width="100" />
<GridViewColumn Header="col1" Width="Auto" />
<GridViewColumn Header="col1" />
</GridView>
</ListView.View>
</ListView>
CS:
private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
UpdateColumnsWidth(sender as ListView);
}
private void ListView_Loaded(object sender, RoutedEventArgs e)
{
UpdateColumnsWidth(sender as ListView);
}
private void UpdateColumnsWidth(ListView listView)
{
int autoFillColumnIndex = (listView.View as GridView).Columns.Count - 1;
if (listView.ActualWidth == Double.NaN)
listView.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
double remainingSpace = listView.ActualWidth;
for (int i = 0; i < (listView.View as GridView).Columns.Count; i++)
if (i != autoFillColumnIndex)
remainingSpace -= (listView.View as GridView).Columns[i].ActualWidth;
(listView.View as GridView).Columns[autoFillColumnIndex].Width = remainingSpace >= 0 ? remainingSpace : 0;
}
答案 3 :(得分:4)
如何使用样式
<Style x:Key="GridViewExtraStyle" TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Background" Value="{x:Null}"/>
<Setter Property="Foreground" Value="{x:Null}"/>
<Setter Property="BorderBrush" Value="{x:Null}"/>
<Setter Property="Width" Value="1000"/>
</Style>
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Header="Abc"/>
<GridViewColumn Header="" HeaderContainerStyle="{DynamicResource GridViewExtraStyle}"/>
</GridView>
</ListView.View>
</ListView>
答案 4 :(得分:0)
我还没有看到一个单行/简单的XAML解决方案。设置适合设计视图的宽度,然后修改窗口大小更改的宽度,如下所示:
Private Sub winMain_SizeChanged(sender As Object, e As SizeChangedEventArgs) Handles Me.SizeChanged
TryCast(lvwDownload.View, GridView).Columns(3).Width = lvwDownload.ActualWidth - 340
End Sub
注意:当调整另一个列的大小时,此逻辑不会更改/悬停列的宽度。使用最后一列填充列表视图非常棒。
答案 5 :(得分:0)
仅限 XAML 的替代方法:创建一个相同大小的隐藏 Grid,对其进行所有调整,并将 GridView Width 绑定到各个 Grid 列的 ActualWidth。
例如,我想要一个 3 列的网格;第一列有一个固定大小的复选框,其他 2 个按 1:4 分割可用空间。
<Grid Visibility="Hidden" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Uid="ColumnDefinition_1" Width="27" />
<ColumnDefinition x:Uid="ColumnDefinition_2" Width="*" />
<ColumnDefinition x:Uid="ColumnDefinition_3" Width="3*" />
</Grid.ColumnDefinitions>
<Grid x:Uid="col0" Grid.Column="0" x:Name="col0"/>
<Grid x:Uid="col1" Grid.Column="1" x:Name="col1"/>
<Grid x:Uid="col2" Grid.Column="2" x:Name="col2"/>
</Grid>
然后你可以像这样绑定宽度:
<GridViewColumn DisplayMemberBinding="{Binding Name}"
Header="First Name"
Width="{Binding ElementName=col1, Path=ActualWidth}" />
可能需要进行一些额外的调整,以解决边距和边框的问题,但这是格式化 GridView 列长度的一种快速而肮脏(如果不一定优雅)的方式。
答案 6 :(得分:-2)
我使用了Pale Ales的建议,但稍有改动:
<Style x:Key="GridViewExtraStyle" TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Background" Value="{x:Null}"/>
<Setter Property="Foreground" Value="{x:Null}"/>
<Setter Property="BorderBrush" Value="{x:Null}"/>
</Style>
<ListView>
<ListView.View>
<GridView ColumnHeaderContainerStyle="{DynamicResource GridViewExtraStyle}">
<GridViewColumn Header="Abc" Width="{Binding Path=mywidth}"/>
</GridView>
</ListView.View>
</ListView>
答案 7 :(得分:-2)
你不能删除最后一栏,但你可能会做一些错觉。
<ControlTemplate TargetType="GridViewColumnHeader">
<Grid>
<ContentPresenter x:Name="HeaderContent"
Content="{TemplateBinding Content}" ... />
<Thumb x:Name="PART_HeaderGripper" ... />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasContent"
Value="false">
<Setter Property="Visibility"
Value="Collapsed"
TargetName="PART_HeaderGripper" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>