WPF-DataGrid colonne avec Width="*", mais MinWidth pour ajuster le contenu

quelle serait la meilleure/bonne façon d'avoir un ensemble de colonnes DataGrid ayant une largeur proportionnelle ( Width="*"), mais de faire en sorte que leur largeur minimum soit au moins la largeur de leur contenu? Pour le moment , si j'utilise Width="*" , alors les colonnes restent exactement proportionnelles, mais le contenu est coupé si les colonnes deviennent trop minces. Si j'utilise Width="Auto" , alors les colonnes se dimensionnent parfaitement à leur contenu, mais cela les rend toutes de tailles différentes.

ce que je veux est vraiment une combinaison des deux, comme Width="*" , MinWidth="Auto" de sorte que quand il y a une largeur supplémentaire les colonnes seront tout l'espace à des largeurs égales, mais quand la grille est réduite, le contenu ne se coupe jamais.

malheureusement, MinWidth="Auto" n'existe pas, donc je suppose que je dois lier la propriété MinWidth de la colonne, mais il est difficile de comprendre exactement à quoi je le lierais.

Comment dire à WPF "MinWidth=" la largeur du contenu le plus large de la colonne?

29
demandé sur garfbradaz 2010-08-04 13:07:20

4 réponses

je sais que c'est un peu tard, mais j'ai trouvé votre question et programmé une solution pure-XAML.

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

où le ElementName indique que le contrôle occupe la plus grande partie de l'espace. Bien sûr, c'est seulement possible avec des éléments, qui ont une largeur limitée. Si vous le faites par exemple pour un GroupBox , que vous pouvez redimensionner seulement à une plus grande largeur et ne jamais redimensionner à une plus petite.

Si vous avez plusieurs candidats pour la valeur de MinWidth , vous devez écrire vous - même un IMultiValueConverter , qui prend un objet [], le analyse à flotteurs, et renvoie le maximum (son juste 1 requête linq si vous l'utilisez seulement vous-mêmes et ne pas besoin de gérer la mauvaise utilisation du convertisseur)

de cette façon supporte également le changement dynamique du MinWidth .

18
répondu Tomas Grosup 2013-08-18 22:12:26

Set Width = "Auto" in XAML.

puis dans le code:

MinWidth = ActualWidth
Width = new GridLength(1, GridUnitType.Star)
12
répondu Anon 2013-08-18 22:11:01

j'ai aussi eu des problèmes pour dimensionner correctement les colonnes de grille à l'intérieur de la colonne GridView. Il y avait plusieurs choses que j'ai essayé, mais ensuite j'ai trouvé le UniformGrid. C'était l'ultime solution pour moi. Il fonctionne, tout simplement. Je ne l'ai pas su avant...il semble qu'il n'existe pas dans VS toolbox par défaut (?) et donc ne savait même pas qu'il existe.

vous pouvez en savoir plus sur UniformGrid de ici .

2
répondu Ollikat 2014-02-26 06:43:05

donner à la colonne un nom dans le XAML:

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

définit ensuite la propriété MinWidth dans le code comme suit:

public MainWindow()
{
    InitializeComponent();

    Col1.MinWidth = 340; //enter desired minimum width here
}
1
répondu danielcooperxyz 2013-08-18 22:13:15