Подтвердить что ты не робот

WPF: расширение последнего столбца ListView GridView

У меня есть ListView с GridView с 3 столбцами. Я хочу, чтобы последний столбец занимал оставшуюся ширину ListView.

4b9b3361

Ответ 2

Существует способ сделать это с помощью шаблона поведения

<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>

Для некоторых примеров см. следующую ссылку и ссылку на http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto

И посмотреть исходный код. Проверять, выписываться https://github.com/rolfwessels/lazycowprojects/tree/master/Wpf

Ответ 3

быстрый и грязный

XAML:

<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:

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;
}

Ответ 4

Как использовать стиль

<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>

Ответ 5

Я не видел однострочного/простого решения XAML. Установите ширину, соответствующую дизайну, а затем измените ширину при изменении размера окна следующим образом:

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

ПРИМЕЧАНИЕ. Эта логика не меняет/наводит ширину столбца при изменении размера другой. Это отлично подходит для заполнения списка с последним столбцом.

Ответ 6

Я использовал предложение 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>

Ответ 7

Вы не можете удалить последний столбец, но вы можете сделать небольшую иллюзию.

            <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>