none
DataGrid mit dynamischer Höhe RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte, dass ein DataGrid immer die maximale Höhe des Fenster einnimmt. Leider kann man das Height Attribut nicht auf * setzen, daher hatte ich es mit einem Binding auf das Elternelement versucht, aber dann passt sich die Höhe nicht an, wenn sich die Größe des Fensters ändert.

    <RibbonWindow
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Custom="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon"
        x:Class="RibbonBar.DataGridTest"
        Title="MainWindow"
        Height="600"
        MinHeight="600"
        Width="800"
        MinWidth="800"
        WindowState="Maximized">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Ribbon x:Name="RibbonWin"  SelectedIndex="0">
                    <!-- ... -->
            </Ribbon>
            <ScrollViewer Grid.Row="1">
                <DockPanel Name="UIPanel" LastChildFill="true" Margin="10">
                    <StackPanel Name="UIContent" DockPanel.Dock="Top">
                        <DataGrid Name="grdList" Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type StackPanel}},Path=ActualHeight}" AutoGenerateColumns="True" IsReadOnly="True" SelectionUnit="FullRow" SelectionMode="Single" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
                    </StackPanel>
                </DockPanel>
            </ScrollViewer>
        </Grid>
    </RibbonWindow>

    Zudem fällt dabei auf, dass Actualheight größer ist als die eigentliche Höhe, hier scheint das Margin des DockPanel noch mit hinzugerechnet zu werden. Ist das richtig? RenderSize.Height ist wiederum kleiner als das eigentliche StackPanel.

    Weiß jemand, wie ich das DataGrid anpassen kann?

    Viele Grüße

    Ingmar


    • Bearbeitet uhp Mittwoch, 23. Oktober 2013 09:50
    Mittwoch, 23. Oktober 2013 09:33

Antworten

  • Hi Ingmar,

    für was nutzt Du das DockPanel und das StackPanel? Deine gewünschte Funktion erreichst Du auch so:

        <ScrollViewer Grid.Row="1">
          <DataGrid Name="grdList" Margin="10" Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type StackPanel}},Path=ActualHeight}" AutoGenerateColumns="True" IsReadOnly="True" SelectionUnit="FullRow" SelectionMode="Single" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        </ScrollViewer>

    Bei mir passt sich das DataGrid an die Fenstergrösse an (auch mit Deinem alten Code). Wenn Du aber nur zwei Zeilen im DataGrid hast, bleiben die natürlich weiter am oberen Rand stehen, aber das DataGrid als solches nimmt die Höhe ein.

    PS: Wenn Du Dein DataGrid in einen ScrollViewer packst, verlierst Du die Virtualisierung, was bei vielen Daten zu Performance-Einbussen führt. Das DataGrid unterstützt selbst ein scrollen und benötigt keinen Extra-ScrollViewer. Es wäre somit besser, das DataGrid nicht in einem ScrollViewer zu verwenden.


    Thomas Claudius Huber

    "If you can´t make your app run faster, make it at least look & feel extremly fast"

    twitter: @thomasclaudiush
    homepage: www.thomasclaudiushuber.com
    author of: ultimate Windows Store Apps handbook | ultimate WPF handbook | ultimate Silverlight handbook

    • Als Antwort markiert uhp Mittwoch, 23. Oktober 2013 13:21
    Mittwoch, 23. Oktober 2013 11:45

Alle Antworten

  • Hi Ingmar,

    für was nutzt Du das DockPanel und das StackPanel? Deine gewünschte Funktion erreichst Du auch so:

        <ScrollViewer Grid.Row="1">
          <DataGrid Name="grdList" Margin="10" Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type StackPanel}},Path=ActualHeight}" AutoGenerateColumns="True" IsReadOnly="True" SelectionUnit="FullRow" SelectionMode="Single" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        </ScrollViewer>

    Bei mir passt sich das DataGrid an die Fenstergrösse an (auch mit Deinem alten Code). Wenn Du aber nur zwei Zeilen im DataGrid hast, bleiben die natürlich weiter am oberen Rand stehen, aber das DataGrid als solches nimmt die Höhe ein.

    PS: Wenn Du Dein DataGrid in einen ScrollViewer packst, verlierst Du die Virtualisierung, was bei vielen Daten zu Performance-Einbussen führt. Das DataGrid unterstützt selbst ein scrollen und benötigt keinen Extra-ScrollViewer. Es wäre somit besser, das DataGrid nicht in einem ScrollViewer zu verwenden.


    Thomas Claudius Huber

    "If you can´t make your app run faster, make it at least look & feel extremly fast"

    twitter: @thomasclaudiush
    homepage: www.thomasclaudiushuber.com
    author of: ultimate Windows Store Apps handbook | ultimate WPF handbook | ultimate Silverlight handbook

    • Als Antwort markiert uhp Mittwoch, 23. Oktober 2013 13:21
    Mittwoch, 23. Oktober 2013 11:45
  • Hallo Thomas,

    vielen Dank für deine hilfreichen Tipps. Ich bin ein Neuling in Sachen WPF. Ich dachte, ich müsste noch einen Container um das DataGrid machen, um es korrekt zu platzieren, aber das war ja völliger quatsch. Wenn ich die überflüssigen Dinge entferne, dann klappt es auch wie gewünscht. Den ScrollViewer habe ich ebenfalls entfernt.

    Vielen dank und Grüße

    Ingmar

    Mittwoch, 23. Oktober 2013 13:21