Hallo ihr Lieben,
ich habe ein Problem mit dem 'DataGrid' und finde dazu im Internet nichts brauchbares.
Ich hoffe ihr könnt mir helfen 🙂
Ich habe einen 'Slider' mit dem ich im 'DataGridColumnHeader' die Größe des Textes ändern kann.
Wenn ich den Text größer mache werden die Spalten automatisch vergrößert.
Wenn ich den Text dann wieder kleiner mache bleiben die Spalten aber vergrößert.
Die Spalten werden nicht automatisch wieder kleiner.
Wie kann ich das (am besten im Style, alternativ im Code) zum funktionieren bringen?
Es müsste unabhängig davon funktionieren ob ich die 'Columns' direkt im XAML definiere oder ob diese mit 'AutoGenerateColumns' automatisch erstellt werden.
Vielen Dank schonmal an euch
Liebe Grüße
Anna
Wie genau änderst du die Größe des Textes? Ich nehme an per FontSize
?
Die Spaltenbreite richtet sich jeweils nach dem eingestellten ColumnWidth bzw. je Spalte DataGridColumn.Width (Werte siehe Größenänderungsoptionen im DataGrid-Steuerelement unter "Größenanpassung von Spalten und Spaltenheader").
Wenn du nur die Größe des Headertexts änderst und die Spalten daran ausgerichtet haben möchtest, dann solltest du also SizeToHeader
benutzen.
Hallo,
vielen Dank für die Antwort.
**SizeToHeader ** habe ich bereits versucht aber leider ohne Auswirkung.
Die Spaltenbreite ist zwar initial auf die Breite des Headertextes angepasst, bei Änderung der Textgröße besteht mein beschriebenes Problem aber weiterhin.
Die Textgröße wird durch den Regler live angepasst, die Spalte wird auch live breiter, aber nicht mehr schmäler.
Ein weiteres Problem was ich durch **SizeToHeader **dann habe ist, dass der Inhalt in den einzelnen Zellen, wenn dieser länger ist als der Header, abgeschnitten ist.
Liebe Grüße
Anna
Dann eben initial SizeToCells
.
Evtl. hilft:
datagrid.InvalidateArrange();
datagrid.UpdateLayout();
?
Auch das hat leider nichts gebracht.
Auf dem Bild ist ein Beispiel zu sehen, was ich versuche.
Wenn ich die Headertexte vergrößere und dann wieder verkleinere, werden die Roten Elemente verkleinert und es erscheint ein gelber Bereich, der dort nicht sein sollte.
Meine Erwartung wäre, dass die komplette Spalte wieder kleiner wird.
Die Spalte behält aber die Breite.
Ich habe folgenden Testcode:
<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>
Wenn es im Style nicht geht muss man es selber machen (wie so oft in .NET) :
Spaltenbreiten merken und wenn die Schrift kleiner wird selbst kleiner machen. ich mache das bei einer ListView bei WinForms so.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Hallo Bernd,
vielen dank für die Antwort.
Schade, dass etwas so "einfaches" nicht mit den vorhandenen Möglichkeiten machbar ist.
Dann versuche ich dass mal.
Grüße Anna
Warum zoomst du nicht einfach das Datagrid?
<mycontrol.LayoutTransform>
<ScaleTransform ScaleX="{Binding Zoom}" ScaleY="{Binding Zoom}" />
</mycontrol.LayoutTransform>
Das Zoom-property kannst du dann an dein Slider binden. Fertig.