如何以以下方式正确处理listview的最后一列大小:


listview不显示丑陋且未使用的“额外”列(例如,参见图片1,或here
(实际)最后一列被拉伸以填充剩余空间
水平滚动条未显示
在任何方向调整大小均不会留下任何伪像(请参见下文)


我已经为此苦苦挣扎了很长一段时间,但没有成功,网上的大量搜索也无法提供任何见解。这是我到目前为止的内容:


我首先尝试调整最后一列的宽度以准确填充整个视图,但是随后弹出了水平滚动条。因此,现在我将所有列的ColumnHeaderContainerStyle设置为不显示任何内容的透明样式,并使用实际样式覆盖每个Column上的HeaderContainerStyle。对于最后一列,我将边距设为负数,以便它填充了来自多余列的多余空白空间。见图2
考虑到边距/边距,计算最后一列的宽度为actualWidth与其他列的宽度之和之间的差
与2相同;宽度不能太小,否则将显示水平滚动条
这是由2引入的:如果最后一列的宽度设置为恒定值,则我可以毫无问题地进行扩展和缩小。使用代码拉伸列时,视图在增长时会正确拉伸,但在收缩时,列表视图的部分行会消失。但是,列标题的大小或多或少保持适当的大小,但仍比普通标题小,请参见图3。这使我认为收缩有一些特殊之处:我所做的计算是相同的,但从视觉上看却不是。但是我找不到框架中发生这种情况的位置/方式。


图片:

Picture 1 http://deathwillendthiswar.dommel.be/default.jpg
Picture 2 http://deathwillendthiswar.dommel.be/start.jpg
Picture 3 http://deathwillendthiswar.dommel.be/afterdrag.jpg

用于扩展的代码,应用于ListView调整大小处理程序中的最后一列

int StretchLastColWidth( ListView lv, int minWidth )
{
  double width = lv.ActualWidth;
  if( width <= 0 )
    return minWidth;

  GridView grdView = lv.View as GridView;
  for( int i = 0 ; i < grdView.Columns.Count - 1 ; ++i )
    width -= ( grdView.Columns[ i ].ActualWidth + 6 ); //padding?

  Decorator border = VisualTreeHelper.GetChild( lv, 0 ) as Decorator;
  ScrollViewer scroll = border.Child as ScrollViewer;
  if( scroll.ComputedVerticalScrollBarVisibility == System.Windows.Visibility.Visible )
    width -= 14; //my scrollbar is smaller than the system default..

  width -= 12  //comes from padding??

  if( width > minWidth )
    return Convert.ToInt32( width );
  else
    return minWidth;
}


Listview的xaml:

<ListView ItemContainerStyle="{StaticResource ListViewItemStyle}">
  <ListView.View>
    <GridView ColumnHeaderContainerStyle="{DynamicResource ListViewEmptyHeaderStyle}">
      <GridViewColumn Width="80" Header="Hdr0" HeaderContainerStyle="{DynamicResource ListViewHeaderStyle}"/>
      <GridViewColumn Header="Hdr1" HeaderContainerStyle="{DynamicResource ListViewLastHeaderStyle}"/>
    </GridView>
  </ListView.View>
</ListView>


如果确实需要,我可以发布整个模板。请注意,尽管我使用相当大的修改风格来显示图片,但是当使用未经修改的标准ListView时,结果完全相同。如果有人想尝试,请使用此样式查看项目行周围的边框:

<Style x:Key="ListViewItemStyle" TargetType ="{x:Type ListViewItem}">
  <Setter Property="BorderBrush" Value="White"/>
  <Setter Property="BorderThickness" Value="1"/>
  <Setter Property="Margin" Value="3,1"/> <!--if not used, border sticks to scrollbar etc-->
  <Setter Property="SnapsToDevicePixels" Value="true"/>
</Style>

最佳答案

查看此CodeProject文章:

ListView Layout ManagerBy Jani Giannoudis

10-04 10:01