Laden...

LiestView mit HeaderTemplate, Spaltenbreite nicht änderbar

Letzter Beitrag vor 3 Monaten 3 Posts 318 Views
LiestView mit HeaderTemplate, Spaltenbreite nicht änderbar

Hallo!

Leider noch ein Problem.

Ich habe eine ListView bei dem ich für die Spalten ein HeaderTemplate (ListViewHeaderLinks) definiert habe:

<Application.Resources>
    <local:SplitConverter x:Key="SplitKonv" Trennzeichen="|"/>
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="ListViewHeaderLinks">
        <Setter Property="HorizontalContentAlignment" Value="Left" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                    <Border BorderBrush="Black" Background="Transparent" BorderThickness="0,0,1,1">
                        <Border HorizontalAlignment="Center" Background="Transparent">
                            <Grid MinHeight="70">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <TextBlock Grid.Row="0" Grid.Column="1" Foreground="Gray" Margin="0,5,0,0"
                                            Text="{TemplateBinding Content, Converter={StaticResource SplitKonv}, ConverterParameter=2}">
                                    <TextBlock.LayoutTransform>
                                        <RotateTransform Angle="-90"/>
                                    </TextBlock.LayoutTransform>
                                </TextBlock>
                                <TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" DockPanel.Dock="Bottom" Padding="5,5,5,1" Width="{TemplateBinding Width}" TextAlignment="Left" FontWeight="Bold"
                                            Text="{TemplateBinding Content, Converter={StaticResource SplitKonv}, ConverterParameter=1}" />
                            </Grid>
                        </Border>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Application.Resources>

Dieses ordne ich den Spalten zu:

<ListView SelectionMode="Single" IsSynchronizedWithCurrentItem="True" Background="LightYellow"
          ItemsSource="{Binding ListImportDateisystem}">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding ZeilenNummer }" Header="Spalte: 1|Zeile" HeaderContainerStyle="{StaticResource ListViewHeaderLinks}" />
            <GridViewColumn DisplayMemberBinding="{Binding DateiPfad }" Header="Spalte: 2|Datei-Pfad" HeaderContainerStyle="{StaticResource ListViewHeaderLinks}" />
            <GridViewColumn DisplayMemberBinding="{Binding DateiName }" Header="Spalte: 3|Datei-Name" HeaderContainerStyle="{StaticResource ListViewHeaderLinks}"/>
            <GridViewColumn DisplayMemberBinding="{Binding DateiGröße }" Header="Spalte: 4|Datei-Größe" HeaderContainerStyle="{StaticResource ListViewHeaderLinks}"/>
            <GridViewColumn DisplayMemberBinding="{Binding DateiDatum }" Header="Spalte: 5|Datei-Datum" HeaderContainerStyle="{StaticResource ListViewHeaderLinks}"/>
        </GridView>
    </ListView.View>
</ListView>

Das HeaderTemplate wird verwendet, alles schön.

Mein Problem ist, dass zur Laufzeit jetzt die Spaltenbreite nicht mehr veränderbar ist, da der Maus-Kursor-Doppelpfeil beim überstreichen der Maus an den Spalten-Grenzen (im Standard eine senkrechte hellgraue Linie) nicht angezeigt wird.

(Im Bild rot umrandet: So müsste es sein, aber beim Überstreichen ändert sich der Maus-Zeiger nicht!)

In deinem Code ist bisher niemand zuständig:

<TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" DockPanel.Dock="Bottom" Padding="5,5,5,1"
                                        Width="{TemplateBinding Width}" TextAlignment="Left" FontWeight="Bold"
                                        Text="{TemplateBinding Content, Converter={StaticResource SplitKonv}, ConverterParameter=1}" />
                            <!-- Resizable Thumb -->
                            <Thumb Grid.Row="1" Grid.Column="2" Width="5" Cursor="SizeWE"
                                   HorizontalAlignment="Right" Background="Transparent"
                                   DragDelta="Thumb_DragDelta"/>
private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
    if (sender is Thumb thumb && thumb.TemplatedParent is GridViewColumnHeader header)
    {
        if (header.Column != null)
        {
            double newWidth = header.Column.Width + e.HorizontalChange;
            header.Column.Width = Math.Max(newWidth, 20); // Mindestbreite setzen
        }
    }
}

Hallo jbrown!

Die Zusammenhänge waren mir bis jetzt noch vollkommen unklar. Mit der Header-Breite steuert man also auch die "Daten"-Breite bei einer GridViewColumn. Gut zu wissen. Ein Thumb-Objekt habe ich bis jetzt auch noch nie benötigt, jetzt wird es klar, wo man es einsetzen kann!

Vielen Dank für deine Unterstützung!!!

So funktioniert bei mir die Breitenänderung der GridViewerColumn perfekt:

private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
    if (sender is Thumb thumb && thumb.TemplatedParent is GridViewColumnHeader header)
    {
        if (header.Column != null)
        {
            double newWidth = header.Column.ActualWidth + e.HorizontalChange;
            header.Column.Width = Math.Max(newWidth, 20); // Mindestbreite setzen
            if (header.Column.Width is double.NaN) header.Column.Width = 20;
        }
    }
}