Авторазмер столбца ListView - PullRequest
11 голосов
/ 14 мая 2010

Допустим, у меня есть следующее 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>

Мне бы хотелось, чтобы столбцы с коротким текстом всегда помещались на экране, а столбец с длинным текстом, чтобы использовать оставшееся пространство, если необходимо, перенос слов

Возможно ли это?

Ответы [ 9 ]

10 голосов
/ 22 мая 2013

Перейдите по этой ссылке: http://www.codeproject.com/KB/grid/ListView_layout_manager.aspx Его работа для меня:)

5 голосов
/ 14 мая 2010

Нет простого способа сделать это с GridListView, так как он не поддерживает установку ширины столбца на «*» (заполнить оставшееся пространство).

Здесь - этообсуждение того, как вы могли бы подделать его, используя IValueConverter, чтобы установить ширину столбца в TotalListWidth - SumOfColumnWidths

С другой стороны, рассматривали ли вы вместо этого DataGrid ?Это будет поддерживать тот тип макета, который вы ищете, хотя и значительно более тяжелый элемент управления.Он также является родным в .NET 4 - хотя вы можете получить эквивалент для 3.5 с помощью WPF Toolkit .

3 голосов
/ 13 января 2016
<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>

В приведенном выше примере я использовал фиктивную сетку, разделил ее на 5 столбцов и, используя привязку, назначил этот размер для "GridViewColum" на

Width = "{Binding ElementName = dummywidth4, Path = ActualWidth}"

Чтобы при изменении размера столбца скрытой фиктивной сетки он отражался и в размере столбца сетки.

3 голосов
/ 14 мая 2010

Установите Width="Auto" на ваших GridViewColumns. Однако из-за виртуализации вы можете столкнуться с некоторыми проблемами с автоматическим изменением размера.

См. Этот вопрос.

Итак, если коротко, если вам нужен точный автоматический размер столбцов, вам потребуется пересчитать ширину при изменении видимых данных из-за виртуализации.

1 голос
/ 18 ноября 2016

Сначала задайте имя в заголовке столбца так:

<GridViewColumn Header="Description" Width="350" x:Name="lvhDescription"/>

А затем при изменении размера изменить ширину.

Private Sub winMain_SizeChanged(sender As Object, e As SizeChangedEventArgs) Handles Me.SizeChanged


    If Me.IsLoaded = False Then Exit Sub

    lvhDescription.Width = e.NewSize.Width - 665


End Sub
1 голос
/ 23 февраля 2013

Это работает для меня, переключая Width на ActualWidth и затем обратно на NaN для любых столбцов, для которых явно не задана ширина. Это будет работать только в том случае, если столбцы списка не содержат элементов управления. Я обычно называю это после того, как данные в списке изменились.

Public Shared Sub AutoResizeListView(lst As Windows.Controls.ListView)
    Dim gv = DirectCast(lst.View, Windows.Controls.GridView)
    For Each gvc In gv.Columns
        If Double.IsNaN(gvc.Width) Then
            gvc.Width = gvc.ActualWidth
            gvc.Width = Double.NaN
        End If
    Next
End Sub
0 голосов
/ 08 июня 2017
<ListView ScrollViewer.VerticalScrollBarVisibility="Auto" Name="someList">
  <ListView.View>
    <GridView>
      <GridViewColumn Width={Binding ElementName=someList, Path=ActualWidth/3} Header="Something" DisplayMemberBinding="{Binding Path=ShortText}" />
      <GridViewColumn  Width={Binding ElementName=someList, Path=ActualWidth/3} Header="Description" DisplayMemberBinding="{Binding Path=VeryLongTextWithCRs}" />
      <GridViewColumn  Width={Binding ElementName=someList, Path=ActualWidth/3} Header="Something Else" DisplayMemberBinding="{Binding Path=AnotherShortText}" />
    </GridView>
  </ListView.View>
</ListView>
0 голосов
/ 05 февраля 2016

Попробуйте этот код вместо

  private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        double remainingSpace = mylistviewname.ActualWidth;

        if (remainingSpace > 0)
        {

            (mylistviewname.View as GridView).Columns[1].Width = Math.Ceiling(remainingSpace / 3);
            (mylistviewname.View as GridView).Columns[2].Width = Math.Ceiling(remainingSpace / 3);
            (mylistviewname.View as GridView).Columns[3].Width = Math.Ceiling(remainingSpace / 3);
        }
    }

Здесь я использую событие SizeChanged, поэтому при изменении размера окна запускается эта функция и обновляется ширина заголовка списка. У меня есть 3 заголовка списка, которые делятся на 3, если у вас более 3 делятся на соответствующие значения.

0 голосов
/ 30 декабря 2014

Я хотел бы представить другой подход для определения размера каждого столбца с наибольшей шириной элемента. Выполните следующие действия для каждого элемента списка с помощью цикла.

Нет необходимости изменять размер после изменения размера окна.

Оставляет UnitWidth как постоянный размер шрифта.

Вы также можете определить делегата для события SourceUpdated.

GridView gv = (myListView.View as GridView);
if (titleLen < c.Title.Length)
{
    titleLen = c.Title.Length;
    gv.Columns[0].Width = titleLen * UnitWidth;
}
if (cssLen < c.CSSName.Length)
{
    cssLen = c.CSSName.Length;
    gv.Columns[1].Width = cssLen * UnitWidth;
}
if (valueLen < c.Value.Length)
{
    valueLen = c.Value.Length;
    gv.Columns[2].Width = valueLen * UnitWidth;
}
...