2010-05-14 108 views
10

比方说,我有以下的ListView:的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> 

我想简短文本列总是适合在屏幕上,并利用剩余的空间,可字的长文本列如有必要包装。

这可能吗?

回答

5

由于GridListView不支持将列的宽度设置为“*”(填充剩余空间),因此没有简单的方法可以对GridListView执行此操作。

Here是你怎么可以伪造它通过使用的IValueConverter设置列TotalListWidth的宽度的讨论 - SumOfColumnWidths

在另一方面,你有没有考虑使用DataGrid呢?这将支持您正在寻找的布局类型,尽管是一个相当重的控制。它也仅适用于.NET 4 - 尽管通过WPF Toolkit可以获得3.5的等效值。

+0

马丁,IValueConverter解决方案的问题是它需要设置所有其他宽度(我宁愿不设置任何)。此时,我无法更改此项目中的ListView,但我一定会使用DataGrid作为下一个。谢谢! – 2010-05-14 20:28:23

+11

如果可以,请避免使用数据网格!这是一堆废话和充满错误 – 2011-02-22 01:32:15

2

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

See this question.

所以,长的故事,总之,如果你愿意,你就需要重新计算列宽度精确自动调整大小的可视化数据的变化,由于虚拟化的时候。

+0

是不是自动的默认?问题是,它似乎创建水平滚动,因为它扩展超出了可用空间。 – 2010-05-14 20:23:05

1

这适用于我,将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

我想为了与最大的元素宽度呈现了另一种尺寸的每一列。 借助于循环在每个列表视图项目上执行以下操作。

无需在重新调整大小窗口事件后更改大小。

叶子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; 
} 
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> 

在上述例子中我已经使用虚设栅并分成5列和使用结合通过

宽度=“{结合的ElementName = dummywidth4该大小为“GridViewColum”分配,Path = ActualWidth}“

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

+0

这不适合我 – luka 2017-10-23 16:48:33

+0

试试这个https://stackoverflow.com/a/35218232/5352831 – Joee 2017-10-25 06:34:10

0

试试这个代码,而不是,

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事件所以当窗口大小改变这种功能被触发并更新listviewheader的宽度。我有3个listviewheaders除以3,如果你有超过3除以适当的价值。

0

在列标题首先设置的名称如下所示:

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

嗯.....什么? – 2016-11-17 21:56:06

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>