简体   繁体   English

WPF:扩展 ListView 的 GridView 的最后一列

[英]WPF : Extend last column of ListView's GridView

I have a ListView with a GridView with 3 columns.我有一个带有 3 列的 GridView 的 ListView。 I want last column to take up remaining width of the ListView.我希望最后一列占据 ListView 的剩余宽度。

That can't be done with simple XAML, but there are some solutions out there.使用简单的 XAML 无法做到这一点,但有一些解决方案。 Check this out:看一下这个:

quick & dirty又快又脏

xaml: xml:

<ListView SizeChanged="ListView_SizeChanged" Loaded="ListView_Loaded" >
    <ListView.View>
        <GridView>
            <GridViewColumn Header="col1" Width="100" />
            <GridViewColumn Header="col1" Width="Auto" />
            <GridViewColumn Header="col1" />
        </GridView>
    </ListView.View>
</ListView>

cs: CS:

private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
    UpdateColumnsWidth(sender as ListView);
}

private void ListView_Loaded(object sender, RoutedEventArgs e)
{
    UpdateColumnsWidth(sender as ListView);
}

private void UpdateColumnsWidth(ListView listView)
{
    int autoFillColumnIndex = (listView.View as GridView).Columns.Count - 1;
    if (listView.ActualWidth == Double.NaN)
        listView.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
    double remainingSpace = listView.ActualWidth;
    for (int i = 0; i < (listView.View as GridView).Columns.Count; i++)
        if (i != autoFillColumnIndex)
            remainingSpace -= (listView.View as GridView).Columns[i].ActualWidth;
    (listView.View as GridView).Columns[autoFillColumnIndex].Width = remainingSpace >= 0 ? remainingSpace : 0;
}

There is a way to do it using behavior pattern有一种方法可以使用行为模式来做到这一点

<ListView HorizontalAlignment="Stretch"
          Behaviours:GridViewColumnResize.Enabled="True">
        <ListViewItem></ListViewItem>
        <ListView.View>
            <GridView>
                <GridViewColumn  Header="Column *"
                                   Behaviours:GridViewColumnResize.Width="*" >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox HorizontalAlignment="Stretch" Text="Example1" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>

See the following link for some examples and link to read more http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto请参阅以下链接以获取一些示例和链接以阅读更多内容http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto

And to see the source code.并查看源代码。 Check out https://github.com/rolfwessels/lazycowprojects/tree/master/Wpf查看https://github.com/rolfwessels/lazycowprojects/tree/master/Wpf

How About Using a Style如何使用样式

<Style x:Key="GridViewExtraStyle" TargetType="{x:Type GridViewColumnHeader}">
    <Setter Property="Background" Value="{x:Null}"/>
    <Setter Property="Foreground" Value="{x:Null}"/>
    <Setter Property="BorderBrush" Value="{x:Null}"/>
    <Setter Property="Width" Value="1000"/>
</Style>

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Abc"/>
            <GridViewColumn Header="" HeaderContainerStyle="{DynamicResource GridViewExtraStyle}"/>
        </GridView>
    </ListView.View>
</ListView>

I haven't seen a one-line/simple XAML only solution.我还没有看到单行/简单的 XAML 解决方案。 Set a width that's appropriate for the design view, and then modify the width on window size change like this:设置适合设计视图的宽度,然后像这样修改窗口大小更改的宽度:

Private Sub winMain_SizeChanged(sender As Object, e As SizeChangedEventArgs) Handles Me.SizeChanged
    TryCast(lvwDownload.View, GridView).Columns(3).Width = lvwDownload.ActualWidth - 340
End Sub

NOTE: This logic does not change/hover the width of a column when another is resized.注意:当调整另一列的大小时,此逻辑不会更改/悬停列的宽度。 It's great for filling a listview with the last column.用最后一列填充列表视图非常有用。

A XAML-only alternative: create a hidden Grid of the same size, do all sizing on it, and bind GridView Width to the ActualWidth of individual Grid columns.仅 XAML 的替代方法:创建一个相同大小的隐藏网格,对其进行所有调整,并将 GridView Width 绑定到各个 Grid 列的 ActualWidth。

For example, I'd like a 3-column grid;例如,我想要一个 3 列的网格; the first column has a fixed-size checkbox, the other 2 split the available space 1:4.第一列有一个固定大小的复选框,其他 2 列按 1:4 分割可用空间。

    <Grid Visibility="Hidden" Grid.Row="2">
        <Grid.ColumnDefinitions>
            <ColumnDefinition x:Uid="ColumnDefinition_1" Width="27" />
            <ColumnDefinition x:Uid="ColumnDefinition_2" Width="*" />
            <ColumnDefinition x:Uid="ColumnDefinition_3" Width="3*" />
        </Grid.ColumnDefinitions>
        <Grid x:Uid="col0" Grid.Column="0" x:Name="col0"/>
        <Grid x:Uid="col1" Grid.Column="1" x:Name="col1"/>
        <Grid x:Uid="col2" Grid.Column="2" x:Name="col2"/>
    </Grid>

Then you can bind the Width like so:然后你可以像这样绑定宽度:

      <GridViewColumn DisplayMemberBinding="{Binding Name}" 
                      Header="First Name" 
                      Width="{Binding ElementName=col1, Path=ActualWidth}" />

Some extra fiddling may be needed, to account for margins and borders, but this is a quick and dirty (if not necessarily elegant) way of formatting the length of GridView columns.可能需要进行一些额外的调整,以考虑边距和边框,但这是格式化 GridView 列长度的一种快速而肮脏(如果不一定优雅)的方式。

I used Pale Ales's suggestion with a minor change:我使用了 Pale Ales 的建议,并稍作改动:

<Style x:Key="GridViewExtraStyle" TargetType="{x:Type GridViewColumnHeader}">
    <Setter Property="Background" Value="{x:Null}"/>
    <Setter Property="Foreground" Value="{x:Null}"/>
    <Setter Property="BorderBrush" Value="{x:Null}"/>
</Style>

<ListView>
    <ListView.View>
        <GridView ColumnHeaderContainerStyle="{DynamicResource GridViewExtraStyle}">
            <GridViewColumn Header="Abc" Width="{Binding Path=mywidth}"/>
        </GridView>
    </ListView.View>
</ListView>

You cannot be remove last column but you can be doin little illusion.你不能删除最后一列,但你可以做一点错觉。

            <ControlTemplate TargetType="GridViewColumnHeader">
                <Grid>
                    <ContentPresenter x:Name="HeaderContent"
                                          Content="{TemplateBinding Content}" ... />
                    <Thumb x:Name="PART_HeaderGripper" ... />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasContent"
                             Value="false">
                        <Setter Property="Visibility"
                                Value="Collapsed"
                                TargetName="PART_HeaderGripper" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM