WPF ListView Как заставить поле занять оставшееся пространство?

382
19 марта 2017, 02:56

Имеется следующий ListView

<ListView ItemsSource="{Binding List}" 
          MaxHeight="250" 
          util:GridViewSort.AutoSort="True" 
          AlternationCount="2"
          SizeChanged="ListView_SizeChanged">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="Height" Value="30" />
            <Style.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                    <Setter Property="Background" Value="White" />
                </Trigger>
                <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                    <Setter Property="Background" Value="#FFF8F8F8" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Название" DisplayMemberBinding="{Binding Name}" util:GridViewSort.PropertyName="Name"/>
                <GridViewColumn Header="Главы" Width="Auto">
                    <GridViewColumn.CellTemplate >
                        <DataTemplate>
                            <TextBlock Text="{Binding ProgressCh}" TextAlignment="Center" Padding="5,0"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Тома" Width="Auto">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding ProgressVol}" TextAlignment="Center" Padding="5,0"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Оценка" util:GridViewSort.PropertyName="Score" Width="70">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Score}" TextAlignment="Center" Padding="5,0"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Тип" util:GridViewSort.PropertyName="Kind" Width="70">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Kind}" TextAlignment="Center" Padding="5,0"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

Отображается он вот так:

Хотелось бы узнать, как настроить столбцы так, чтобы все кроме первого столбца занимали ширину по содержимому самого широкого элемента, а первый столбец занимал всё оставшееся пространство.

Установка Width="Auto" как -то не помогла. Второй и Третий столбцы всё равно урезаются. Плюс появляется горизонтальный Scroll, за которым скрыт последний столбец =(

Подскажите как подобное можно реализовать?

Answer 1

Естественно, Auto не работает, потому что оно делает ширину равной максимальной ширине элемента; а других спецзначений у ширины нет. Вы, тем не менее, можете попробовать сделать следующее:

  • Установить у всех колонок, кроме первой, Width=Auto
  • Добавить обработчик события SizeChanged:

_

private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
    ListView listView = sender as ListView;
    GridView gView = listView.View as GridView;
    var totalWidth = listView.ActualWidth - (SystemParameters.VerticalScrollBarWidth+10); 
    var usedWidth = 0.0;    
    for(int i=1;i<gView.Columns.Count;i++){
        usedWidth+=gView.Columns[i].ActualWidth;
    }
    gView.Columns[0].Width = totalWidth-usedWidth;
}

(Также этот код надо вызвать при изменении содержимого списка).

READ ALSO
C sharp wpf как правильно собрать проект?

C sharp wpf как правильно собрать проект?

Помогите! Не могу собрать проектДелаю релиз - у меня запускается, на 4 других машинах либо ошибка(на одной машине), либо совсем ничего

292
Отображение формата Decimal в целом виде asp.net mvc

Отображение формата Decimal в целом виде asp.net mvc

Такой вопрос, у меня есть БД и цена хранится в decimal

242
Почему не выводит ошибку регистрации php

Почему не выводит ошибку регистрации php

Не пишет ошибку что логин занят и что поля пустые, всегда пишет что успешно зарегистрированыВ базу заносит если верно данные вести

329