Dynamische GUI (DataGrid)


AnnaBauer21

Grünschnabel
Hallo ihr Lieben,

ich habe ein Problem, an dem ich seit 2 Wochen herumexperimentiere.
Ich finde einfach keine Lösung und hoffe ihr könnt mir helfen.
Ich habe dazu ein kleines Testprojekt erstellt.

Ich vergrößere durch einen Slider den Text im Header eines DataGrid's. -> Die Spalten werden breiter!
Ich verkleinere durch einen Slider den Text im Header wieder -> Die Spalten behalten ihre breite!

Ich suche eine Möglichkeit, mit der sich die Spalten des DataGrid's wieder entsprechend verkleinern.

Initial zeigt die Tabelle nach starten des Testprogramms, dann vergrößere ich den Headertext, und dann mache ich ihn wieder kleiner.
Initial.png

Mit dem Programm Snoop habe ich herausgefunden, dass die einzelnen DataGridColumnHeader die richtige Größe haben, was man auch an dem rot umrahmten Headertext links oben sehen kann.
Snoop1.png


Der Gelbe Bereich der nach dem Verkleinern erscheint, ist wie in Snoop zu sehen ist, ein Grid welches im DataGridColumnsPresenter liegt.
Snoop2.png

Ich habe folgenden Code:
XML:
<Style
    x:Key="ColumnHeaderStyleT11"
    BasedOn="{StaticResource {x:Type DataGridColumnHeader}}"
    TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="Background" Value="Pink" />
    <Setter Property="FontSize" Value="{Binding ElementName=Text1, Path=Value, UpdateSourceTrigger=PropertyChanged}" />
    <Setter Property="HorizontalAlignment" Value="Left" />
    <Setter Property="HorizontalContentAlignment" Value="Left" />
</Style>

...

<TextBox
    Grid.Row="0"
    Grid.Column="2"
    Grid.ColumnSpan="2"
    Text="{Binding ElementName=Text1, Path=Value, UpdateSourceTrigger=PropertyChanged}" />
<Slider
    Name="Text1"
    Grid.Row="0"
    Grid.Column="6"
    Grid.ColumnSpan="2"
    VerticalAlignment="Center"
    IsSnapToTickEnabled="True"
    Maximum="30"
    Minimum="17"
    TickFrequency="1"
    Value="{Binding Minimum, RelativeSource={RelativeSource Self}, Mode=OneTime}" />

<DataGrid
    x:Name="PART_MyDataGrid1"
    Grid.Row="1"
    Grid.RowSpan="11"
    Grid.Column="0"
    Grid.ColumnSpan="12"
    AutoGenerateColumns="True"
    CanUserReorderColumns="True"
    CanUserResizeColumns="True"
    CanUserResizeRows="True"
    CanUserSortColumns="True"
    ColumnHeaderStyle="{DynamicResource ColumnHeaderStyleT11}"
    ColumnWidth="SizeToHeader"
    ItemsSource="{Binding MyList}">
</DataGrid>

Ich hoffe sehr, dass ihr mir weiterhelfen könnt.
Ich habe auch schon versucht im Code über ein SizeChanged Event die Breiten der einzelnen Headerelemente und auch aller einzelnen Cell Elemente der Rows direkt zu setzen aber bin auch da gescheidert und es erschien mir als totaler Unsinn.

Liebe Grüße
Anna
 

Spyke

Premium-User
Schon Property im Style auch die Width per Binding zu setzen?
Ev. noch als Mode OneWay im Binding angeben.

P.S.: deinen Slider als Text1 zu benennen ist irgendwie blöd gewählt ;-)

Edit:
Ach sorry der Slider verändert ja die FontSize, das zusätzlich mit den Binding der Width war dann ne blöde Idee von mir.
 

Spyke

Premium-User
Hab bei mir mal nachgeseheh die Width anpassen war schon richtig aber so

C#:
Width="{Binding Column.ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridColumnHeader}}}"
das im Style von deinem ColumnHeaderStyleT11 mit setzen.
als Setter Property angabe natürlich, den Teil oben hab ich schnell aus meinem Template geklaut
 

AnnaBauer21

Grünschnabel
Hallo,
das hat leider nichts gebracht.

Aber ich habe mir Column etwas genauer angesehen und habe nun im Code die Width aus DesiredSize von DataGridColumnHeader an DataGridColumnHeader.Column.Width übergeben und UpdateLayout() aufgerufen.
Das hat mein Problem behoben!
Die Breite von Column hat sich beim verkleinern des Textes nicht geändert und musste entsprechend gesetzt werden.
 

Neue Beiträge