ListView列自动调整大小

Die*_*hon 12 wpf listview autosize

假设我有以下ListView:

<ListView ScrollViewer.VerticalScrollBarVisibility="Auto">
  <ListView.View>
    <GridView>
      <GridViewColumn Header="Something" 
                      DisplayMemberBinding="{Binding Path=ShortText}" />
      <GridViewColumn Header="Description"
                      DisplayMemberBinding="{Binding Path=VeryLongTextWithCRs}" />
      <GridViewColumn Header="Something Else" 
                      DisplayMemberBinding="{Binding Path=AnotherShortText}" />
    </GridView>
  </ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)

我希望短文本列始终适合屏幕,而长文本列则使用剩余空间,必要时自动换行.

那可能吗?

小智 10

请访问此链接:http://www.codeproject.com/KB/grid/ListView_layout_manager.aspx 它的工作对我来说:)

  • 那看起来不错.3年太晚了,但很好:-)我会考虑将来的项目. (2认同)

Joe*_*oee 6

<Grid Name="dummygrid" Visibility="Hidden">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.5*"></ColumnDefinition>
                <ColumnDefinition Width="0.2*"></ColumnDefinition>
                <ColumnDefinition Width="0.1*"></ColumnDefinition>
                <ColumnDefinition Width="0.2*"></ColumnDefinition>
                <ColumnDefinition Width="150"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Border Grid.Column="0" Name="dummywidth1"></Border>
            <Border Grid.Column="1" Name="dummywidth2"></Border>
            <Border Grid.Column="2" Name="dummywidth3"></Border>
            <Border Grid.Column="3" Name="dummywidth4"></Border>
            <Border Grid.Column="5" Name="dummywidth5"></Border>
        </Grid>
        <ListView  Name="Installer_LV" Grid.Row="1" ItemContainerStyle="{StaticResource LV_ItemStyle}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"  AlternationCount="2">
            <ListView.View>
                <GridView ColumnHeaderContainerStyle="{StaticResource LV_HeaderStyle}">
                    <GridViewColumn  Width="{Binding ElementName=dummywidth1, Path=ActualWidth}"  DisplayMemberBinding="{Binding DisplayName}" >
                        <GridViewColumn.Header>
                            <GridViewColumnHeader Tag="DisplayName" Click="InstallerLV_HeaderClick">Name</GridViewColumnHeader>
                        </GridViewColumn.Header>
                    </GridViewColumn>
                    <GridViewColumn  Width="{Binding ElementName=dummywidth2, Path=ActualWidth}" DisplayMemberBinding="{Binding Publisher}">
                        <GridViewColumn.Header>
                            <GridViewColumnHeader Tag="Publisher" Click="InstallerLV_HeaderClick">Publisher</GridViewColumnHeader>
                        </GridViewColumn.Header>
                    </GridViewColumn>
                    <GridViewColumn  Width="{Binding ElementName=dummywidth3, Path=ActualWidth}" DisplayMemberBinding="{Binding Version}">
                        <GridViewColumn.Header>
                            <GridViewColumnHeader Tag="Version" Click="InstallerLV_HeaderClick">Version</GridViewColumnHeader>
                        </GridViewColumn.Header>
                    </GridViewColumn>
                    <GridViewColumn  Width="{Binding ElementName=dummywidth4, Path=ActualWidth}" DisplayMemberBinding="{Binding Size}">
                        <GridViewColumn.Header>
                            <GridViewColumnHeader Tag="Size" Click="InstallerLV_HeaderClick">Size</GridViewColumnHeader>
                        </GridViewColumn.Header>
                    </GridViewColumn>
                    <GridViewColumn Header="Action" Width="150">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button  Height="38" Width="130" Style="{DynamicResource RoundedButton}" Content="{Binding Status}" Tag="{Binding ModuleId}"  HorizontalAlignment="Center" VerticalAlignment="Center" Click="onActionClick"></Button>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我使用了一个虚拟网格并分成 5 列,并使用绑定将该大小分配给“GridViewColum”

宽度=“{绑定元素名称=虚拟宽度4,路径=实际宽度}”

这样,当隐藏的虚拟网格列大小发生变化时,它也会反映在 gridview 列大小中。


Dou*_*oug 5

Width="Auto"在您的 GridViewColumns 上设置。但是,由于虚拟化,您可能会遇到一些自动调整大小的问题。

看到这个问题。

因此,长话短说,如果您想要准确地自动调整列的大小,由于虚拟化,您需要在可见数据发生变化时重新计算宽度。


Mar*_*ris 5

使用GridListView没有简单的方法,因为它不支持将列的宽度设置为"*"(填充剩余空间).

下面讨论如何通过使用IValueConverter将列的宽度设置为TotalListWidth来伪造它 - SumOfColumnWidths

另一方面,您是否考虑过使用DataGrid?这将支持您正在寻找的那种布局,但是控制相当重.它也只是.NET 4中的原生 - 虽然你可以通过WPF工具包获得3.5的等价物.

  • 如果可以,请避免使用数据网格!这是一堆废话,充满了虫子 (12认同)