如何以下列方式正确处理listview的最后一栏:
我一直在努力解决这个问题很长时间没有成功,网上的大量搜索也没有提供任何见解。这是我到目前为止所做的:
我首先尝试调整最后一列的宽度以准确填充整个视图,但随后会弹出水平滚动条。所以现在我将所有列的ColumnHeaderContainerStyle设置为一个不显示任何内容的透明样式,并使用实际样式覆盖每个Column上的HeaderContainerStyle;对于最后一列,我将边距设为负值,以便填充来自额外列的额外空白空间。见图2
计算最后一列的宽度,作为考虑边距/填充的其他列宽度之和的差值
与2相同;宽度不能太小,否则显示水平滚动条
这是由2引入的:如果最后一列的宽度设置为一个常量值,我可以毫无问题地增长和缩小。使用代码拉伸列时,视图在生长时会正确拉伸,但缩小时,listview的一部分行会消失。然而,列标题大小或多或少保持适当大小,但仍然小于正常,见图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>