正确调整wpf ListView的最后一列

时间:2009-12-09 08:25:19

标签: c# wpf xaml listview expression-blend

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

  1. listview不显示丑陋且未使用的“额外”列(例如,参见图1或here
  2. (实际)最后一列被拉伸以填充剩余空间
  3. 水平滚动条未显示
  4. 在任何方向调整大小都不会留下任何人工制品(见下文)
  5. 我一直在努力解决这个问题很长时间没有成功,网上的大量搜索也没有提供任何见解。这是我到目前为止所做的:

    1. 我首先尝试调整最后一列的宽度以准确填充整个视图,但随后会弹出水平滚动条。所以现在我将所有列的ColumnHeaderContainerStyle设置为一个不显示任何内容的透明样式,并使用实际样式覆盖每个Column上的HeaderContainerStyle;对于最后一列,我将边距设为负值,以便填充来自额外列的额外空白空间。见图2

    2. 计算最后一列的宽度,作为考虑边距/填充的其他列宽度之和的差值

    3. 与2相同;宽度不能太小,否则显示水平滚动条

    4. 这是由2引入的:如果最后一列的宽度设置为一个常量值,我可以毫无问题地增长和缩小。使用代码拉伸列时,视图在生长时会正确拉伸,但缩小时,listview的一部分行会消失。然而,列标题大小或多或少保持适当大小,但仍然小于正常,见图3.这让我觉得缩小有一些特别之处:我做的计算是相同的,但在视觉上却不是。但是,我无法在框架中找到这种情况发生的位置。

    5. 图片:

      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>
      

1 个答案:

答案 0 :(得分:0)

查看此CodeProject文章:

ListView Layout Manager By Jani Giannoudis