WPF:扩展 ListView 的 GridView 的最后一列

Posted

技术标签:

【中文标题】WPF:扩展 ListView 的 GridView 的最后一列【英文标题】:WPF : Extend last column of ListView's GridView 【发布时间】:2010-10-29 00:22:27 【问题描述】:

我有一个带有 3 列的 GridView 的 ListView。我希望最后一列占据 ListView 的剩余宽度。

【问题讨论】:

这是一个正确的great link。 【参考方案1】:

使用简单的 XAML 无法做到这一点,但有一些解决方案。看看这个:

ListView Layout Manager Star size of a ListView column

【讨论】:

ListView 布局管理器链接正是我所需要的。感谢您发帖。【参考方案2】:

又快又脏

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;

【讨论】:

忽略滚动条的样子。 @Krythic 这不是投反对票的绝佳理由。【参考方案3】:

有一种使用行为模式的方法

<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

【讨论】:

"Behaviours:GridViewColumnResize.Width" 和 "Behaviours:GridViewColumnResize.Enabled" 在 WPF 中不存在;你在使用第三方框架吗?提到这一点会很有用。在您的答案得到修复/更新之前,暂时投反对票。 @Krythic 它认为您可能错过了我解释您需要添加一些源代码的部分。它们被称为行为...是 wpf 的一部分。查看 github 链接,将其添加到您的源代码中。 嗯,我在 2011 年写过,我真的不再做 WPF,但我想这个问题已经解决了。【参考方案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>

【讨论】:

这是我见过的最好的答案。简单有效。 不幸的是,你现在有一个很长的水平滚动条要处理【参考方案5】:

我还没有看到单行/简单的仅 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

注意:当调整另一列的大小时,此逻辑不会更改/悬停列的宽度。非常适合用最后一列填充列表视图。

【讨论】:

这对我有用,但我在 Loaded 事件和 SizeChanged 上调用它,并且必须留出很小的边距以防止出现滚动条。 gridView.Columns[1].Width = listView.ActualWidth - gridView.Columns[0].ActualWidth - 10【参考方案6】:

仅适用于 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 列长度的一种快速而肮脏(如果不一定优雅)的方式。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

你不能删除最后一列,但你可以做些小错觉。

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

【讨论】:

OP 不想隐藏最后一列,他们想扩展它以填充剩余的宽度

以上是关于WPF:扩展 ListView 的 GridView 的最后一列的主要内容,如果未能解决你的问题,请参考以下文章

添加数据库后填充listview

如何使 DockPanel 中的项目扩展以适应 WPF 中的所有可用空间?

C# wpf listview 如何动态添加 高手回答下

C# wpf listview 如何得到按钮所在行?

wpf listview问题。给listview的每一行都加个button,button绑定该行。

WPF:如何在拖动 ListView 项目时允许在 ListView 中使用鼠标滚轮滚动?