GridViewColumnHeader не охватывает всю ширину ListView - PullRequest
0 голосов
/ 15 ноября 2018

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

Полагаю, стандартный шаблон заголовка содержит что-то, о чем я не позабочусь, я просто не могу обернуться вокруг него.

(Упрощенный) ListView имеет пространство в несколько пикселей слева и справа от строки, содержащей заголовки, где виден фон родительского ListView:

https://i.imgur.com/XijV88a.jpg

Вопрос: Как сделать так, чтобы заголовки столбцов охватывали всю ширину ListView и чтобы пространство в несколько пикселей исчезло?

Мой XAML:

<ListView Padding="0"
          BorderThickness="0"
          Background="Red">

    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Background" Value="LightGray" />
            <Setter Property="Margin" Value="0" />
            <Setter Property="Padding" Value="0" />
            <Setter Property="BorderThickness" Value="0" />
        </Style>
    </ListView.ItemContainerStyle>

    <ListView.View>
        <GridView>
            <GridView.ColumnHeaderContainerStyle>
                <Style TargetType="{x:Type GridViewColumnHeader}">
                    <Setter Property="Foreground" Value="White" />
                    <Setter Property="Background" Value="Black" />
                    <Setter Property="BorderThickness" Value="0" />
                    <Setter Property="Margin" Value="0" />
                    <Setter Property="Padding" Value="0" />
                    <Setter Property="HorizontalAlignment" Value="Stretch" />
                </Style>
            </GridView.ColumnHeaderContainerStyle>

            <GridViewColumn Header="1" Width="40"/>
            <GridViewColumn Header="2" Width="40"/>
            <GridViewColumn Header="3" Width="40"/>

        </GridView>
    </ListView.View>

    <ListViewItem> 1 </ListViewItem>
    <ListViewItem> 2 </ListViewItem>
</ListView>

Единственный способ достичь желаемого вида - это изменить цвет фона списка на тот же цвет, что и у заголовков - хотя и должен быть лучший способ. Любая помощь приветствуется!

1 Ответ

0 голосов
/ 15 ноября 2018

Этот столбец не поддерживает "*" в качестве аргумента ширины, поэтому вы не можете легко сказать - заполните остальные ...

Что вам нужно сделать, это подключиться к событию SizeChanged объекта ListView и выполнить вычисления. Например, в вашем случае, если бы мы хотели, чтобы первые два столбца занимали по 40 каждый, а третий столбец - по остальным, вы бы сделали это так:

private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
    ListView listView = sender as ListView;
    GridView gView = listView.View as GridView;

    var workingWidth = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth;

    gView.Columns[0].Width = 40;
    gView.Columns[1].Width = 40;
    gView.Columns[2].Width = workingWidth - 80;
}

EDIT

Для пробелов (слева и справа) в строке заголовка вы хотите изменить ColumnHeaderContainerStyle следующим образом:

<GridView.ColumnHeaderContainerStyle>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Background" Value="Black" />
        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="Margin" Value="-2,0,-2,0" />
        <Setter Property="Padding" Value="0" />
        <Setter Property="HorizontalAlignment" Value="Stretch" />
    </Style>
</GridView.ColumnHeaderContainerStyle>

Поэтому убедитесь, что вы просто уменьшаете поле на -2 с каждой стороны.

...