我有一个 ListView
控件,我想要调整最后一列的大小以与 Window
的大小同步。因此,如果 Window
的宽度增加了 100 个单位,我希望列的宽度也增加 100 个单位。
我应该在 Window 上使用 Resize
事件,并手动调整列标头的大小吗?类似于:
columnHeader.Width = windowSize.X - 400;
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Date" />
<GridViewColumn Width="140" Header="Day"
DisplayMemberBinding="{Binding DayOfWeek}" />
<GridViewColumn Width="140" Header="Year"
DisplayMemberBinding="{Binding Year}"/>
</GridView>
</ListView.View>
<sys:DateTime>1/2/3</sys:DateTime>
<sys:DateTime>4/5/6</sys:DateTime>
<sys:DateTime>7/8/9</sys:DateTime>
</ListView>
<GridViewColumn Header="Year" DisplayMemberBinding="{Binding Year}">
<GridViewColumn.Width>
<MultiBinding Converter="{StaticResource lastColumnMaximizerConverter}">
<Binding Path="ActualWidth"
RelativeSource="{RelativeSource AncestorType=ListView}"/>
<Binding Path="View.Columns"
RelativeSource="{RelativeSource AncestorType=ListView}"/>
</MultiBinding>
</GridViewColumn.Width>
</GridViewColumn>
public class WidthCalculationMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
// do some sort of calculation
double totalWindowWidth;
double otherColumnsTotalWidth = 0;
double.TryParse(values[0].ToString(), out totalWindowWidth);
var arrayOfColumns = values[1] as IList<GridViewColumn>;
for (int i = 0; i < arrayOfColumns.Count - 1; i++)
{
otherColumnsTotalWidth += arrayOfColumns[i].Width;
}
return (totalWindowWidth - otherColumnsTotalWidth) < 0 ?
0 : (totalWindowWidth - otherColumnsTotalWidth);
}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
嘘...顺便说一下,这并不是最安全的代码。你需要改进它!这只是一个演示,你知道演示代码的性质! :)
最后,我们需要在XAML中实例化我们的转换器实例。
<Grid.Resources>
<Converters:WidthCalculationMultiConverter
x:Key="lastColumnMaximizerConverter"/>
</Grid.Resources>
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding}" Width="100"/>
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding}" Width="50"/>
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding}" Width="50"/>
<GridViewColumn Header="4" DisplayMemberBinding="{Binding}">
<GridViewColumn.Width>
<MultiBinding Converter="{StaticResource starWidthConverter}">
<Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType=ListView}"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ListView}"/>
</MultiBinding>
</GridViewColumn.Width>
</GridViewColumn>
</GridView>
</ListView.View>
<ListViewItem>item1</ListViewItem>
<ListViewItem>item2</ListViewItem>
<ListViewItem>item3</ListViewItem>
<ListViewItem>item4</ListViewItem>
</ListView>
ListView listview = value[1] as ListView;
double width = listview.ActualWidth;
GridView gv = listview.View as GridView;
for(int i = 0;i < gv.Columns.Count-1;i++)
{
if(!Double.IsNaN(gv.Columns[i].Width))
width -= gv.Columns[i].Width;
}
return width - 5;// this is to take care of margin/padding
获取listview的宽度,并计算新的大小。