2010-08-04 9 views
28

Was ist die beste/richtige Weg wäre, eine Reihe von DataGrid Spalten proportional Breite haben (Width="\*"), aber ihre Mindest Breite sein, um zumindest die Breite ihres Inhalts? Im Moment, wenn ich Width="*" verwende, dann bleiben die Spalten genau proportional, aber der Inhalt wird beschnitten, wenn die Spalten zu dünn werden.Wenn ich Width="Auto" verwende, dann passen sich die Spalten perfekt an ihren Inhalt an, aber diesWPF - Datagrid-Spalte mit Width = „*“, aber MinWidth Inhalt anpassen

Was ich will ist wirklich eine Kombination der beiden, wie Width="\*", MinWidth="Auto", so dass, wenn es zusätzliche Breite der Spalten alle gibt Abstand zu gleichen Breiten, aber wenn das Raster verkleinert wird, wird der Inhalt nie abgeschnitten.

Traurig, MinWidth="Auto" existiert nicht, also denke ich, dass ich die MinWidth Eigenschaft der Spalte binden muss, aber es ist schwer, genau herauszufinden, was ich es binden würde.

Wie sage ich WPF "MinWidth=" die Breite des breitesten Inhalts der Spalte?

+1

Das Aktivieren von MinWidth = "auto" wäre eine nette Funktion. –

Antwort

11

Set Width = "Auto" in XAML.

Dann im Code:

MinWidth = ActualWidth 
Width = new GridLength(1, GridUnitType.Star) 
+1

Arbeitete für mich. Führen Sie eine Schleife durch alle Spalten im Raster und führen Sie den Code oben in allen aus. Legen Sie die Schleife in einen Handler für das geladene Ereignis des Gitters – saus

+0

dauerte mich eine Weile, um herauszufinden, auch mit dieser Hilfe. Siehe meine Antwort unter http://stackoverflow.com/questions/13631694/wpf-datagrid-column-width-auto-and-scrollbar – Brent

18

Ich weiß, es ist ein bisschen spät, aber ich fand Ihre Frage ein und programmiert, um eine reine XAML Lösung.

<ColumnDefinition Width="42*" MinWidth="{Binding Path=ActualWidth, ElementName=projectInfoHeader }"/> 

Wo die ElementName Punkte an die Steuerung nimmt den meisten Platz auf. Das ist natürlich nur mit Elementen möglich, die eine begrenzte Breite haben. Wenn Sie es zum Beispiel für eine GroupBox tun, dann können Sie die Größe nur auf eine größere Breite und nie auf eine kleinere Größe ändern.

Wenn Sie mehrere Kandidaten für den Wert von MinWidth haben, müssen Sie sich einen IMultiValueConverter schreiben, die ein Objekt nimmt [], analysiert sie schwimmt, und gibt das Maximum (es ist nur 1 Linq-Abfrage, wenn Sie es nur benutzen, selbst und müssen nicht mit der schlechten Nutzung des Konverters umgehen)

Auf diese Weise unterstützt auch dynamische Änderung der MinWidth.

1

die Spalte einen Namen in der XAML geben:

Ich hatte auch Probleme Größe Grid Spalten korrekt in dem
public MainWindow() 
{ 
    InitializeComponent(); 

    Col1.MinWidth = 340; //enter desired minimum width here 
} 
+0

Sie können Minwidth und Maxwidth als Spaltenattribut hinzufügen. Keine Notwendigkeit, den Code dahinter zu berühren –

2

:

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" Name="Col1"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
</Grid> 

Dann im Code die MinWidth Eigenschaft festgelegt, wie unten gezeigt GridViewColumn. Es gab mehrere Dinge, die ich ausprobiert habe, aber dann habe ich das UniformGrid gefunden. Es war die ultimative Lösung für mich. Es funktioniert einfach. Ich habe es vorher nicht gewusst ... scheint, dass es in der VS-Toolbox standardmäßig nicht existiert (?) Und wusste daher nicht, dass es überhaupt existiert. Weitere Informationen zu UniformGrid finden Sie unter here.

0

einfach können Sie unter Code verwenden, um max oder min Breite der Spalte

<ColumnDefinition Width="*" MaxWidth="40"/> 

Dieses den verfügbaren Platz nehmen wird, aber es wird auf max 40px

begrenzen Sie das gleiche mit minwidth tun können auch

Dies wird den verfügbaren Platz nehmen, aber immer sicherstellen, dass es mindestens 50px Speicherplatz hat. Hoffe das wird helfen.