2010-05-14 83 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>