如何自动拉伸ListView的列以填充WPF中包含的Grid?

时间:2010-11-11 12:27:02

标签: wpf listview

我创建了一个由2列组成的ListView:“文件名”和“大小(MB)”。此ListView包含在Grid中。由于文件名可能比文件大小长,因此我希望为“文件名”列分配尽可能宽的宽度,而不会损坏“大小”列。 换句话说,我希望“大小”列适合其内容,并希望“文件名”列填充网格的其余部分。

我一直在玩很多参数,但可以实现我的目标。

我的最后一次尝试看起来像这样:

                <ListView Name="BrowseFilesListView">                        
                    <ListView.ItemContainerStyle>
                        <Style TargetType="ListViewItem">
                            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                        </Style>
                    </ListView.ItemContainerStyle>                        
                    <ListView.View>
                        <GridView>                               
                            <GridViewColumn Header="File Name"> 
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Name}" HorizontalAlignment="Stretch"/>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                            <GridViewColumn Width="Auto" Header="Size (MB)" DisplayMemberBinding="{Binding Path=Size}"/>
                        </GridView>
                    </ListView.View>
                </ListView>

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

据我所知,WPF不支持此功能。也许你应该看看这个解决方案:

http://www.codeproject.com/KB/grid/ListView_layout_manager.aspx

答案 1 :(得分:0)

这应该有效:

var gridView = SearchResultsTable.View as GridView;
var columns = new GridViewColumnCollection();
if (gridView != null)
{
    columns = gridView.Columns;
}
var width = BrowseFilesListView.ActualWidth;
var sizeWidth = columns[1].ActualWidth; // columns[0] is the Filename, etc.
const int padding = 10; // slightly hackish
columns[0].Width = width - sizeWidth - padding;

我会在Window_Loaded事件中将它放在视图的代码隐藏中。它不检查文件大小的宽度;我假设它们会比它们的标题小。