2010-05-14 20 views
10

Digamos que tengo el siguiente ListView:ListView columna de tamaño automático

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

me gustaría las columnas de texto cortos para encajar siempre en la pantalla, y la columna de texto largo para utilizar el espacio restante, palabra- envolviendo si es necesario.

¿Es posible?

Respuesta

5

No es una manera fácil de hacer esto con un GridListView ya que no admite establecer el ancho de una columna en "*" (rellenar el espacio restante).

Here es una discusión de cómo se podría fingir utilizando un IValueConverter para establecer el ancho de la columna para TotalListWidth - SumOfColumnWidths

Por otra parte, ¿ha considerado el uso de un DataGrid en su lugar? Esto apoyará el tipo de diseño que está buscando, aunque es un control considerablemente más pesado. También es nativo en .NET 4, aunque puede obtener un equivalente de 3.5 a través del WPF Toolkit.

+0

Martin, el problema con la solución IValueConverter es que requiere que se configuren todos los demás anchos (prefiero no configurar ninguno). En este punto, no puedo cambiar las ListViews en este proyecto, pero definitivamente usaré DataGrid para la próxima. ¡Gracias! –

+11

¡Evita la cuadrícula de datos si puedes! Es un montón de basura y lleno de errores –

2

Establezca Width="Auto" en su GridViewColumns. Sin embargo, debido a la virtualización puede encontrar algunos problemas con el auto-tamaño.

See this question.

Por lo tanto, a largo relato corto, si quieres precisa de tamaño automático de columnas que tendrá que volver a calcular el ancho de cuando cambian los datos visibles, debido a la virtualización.

+0

No es automático por defecto? El problema es que parece crear desplazamiento horizontal porque se expande más allá del espacio disponible. –

1

Esto funciona para mí, alternar el Width con el y luego volver al NaN para cualquier columna que no tenga ancho explícitamente establecido. Esto solo funcionará si las columnas de la vista de lista no contienen controles. Normalmente lo llamo después de que los datos en la lista hayan cambiado.

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

me gustaría presentar un otro enfoque con el fin de tamaño de cada columna con la anchura del elemento más grande. Haga lo siguiente en cada elemento de vista de lista con la ayuda de un bucle.

No es necesario cambiar el tamaño después de un evento de cambio de tamaño de ventana.

Hojas UnitWidth como el tamaño de ancho de fuente constante.

También puede definir un delegado para el evento 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; 
} 
3
<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> 

En el ejemplo anterior he utilizado una rejilla maniquí y se dividió en 5 columnas y el uso de la unión asignar que el tamaño a "GridViewColum" por

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

De modo que cuando cambie el tamaño oculto de la columna de cuadrícula, también se reflejará en el tamaño de columna de la cuadrícula.

+0

esto no funciona para mí – luka

+0

Pruebe este https://stackoverflow.com/a/35218232/5352831 – Joee

0

Prueba este código en su lugar,

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); 
     } 
    } 

Aquí i usuario evento SizeChanged así que cuando el cambio de tamaño de las ventanas esta función se activa y actualizar el ancho de la listviewheader. Tengo 3 listviewheaders dividido por 3 si tienes más de 3 dividido por el valor apropiado.

0

primer conjunto el nombre en el encabezado de la columna así:

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

Y luego el cambio de tamaño modificar la anchura.

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

Ummm ..... ¿Qué? –

0
<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> 
Cuestiones relacionadas