web-dev-qa-db-fra.com

WPF - Colonne DataGrid avec Width = "*", mais MinWidth pour s'adapter au contenu

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

Ce que je veux, c'est vraiment une combinaison des deux, comme Width="\*", MinWidth="Auto" de sorte que lorsqu'il y a une largeur supplémentaire, les colonnes s'espacent toutes à des largeurs égales, mais lorsque la grille est réduite, le contenu n'est jamais recadré.

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 la lierais.

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

32
Andy T

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 }"/> 

ElementName pointe vers le contrôle occupant la plus grande partie de l'espace. Bien sûr, cela n'est possible qu'avec des éléments qui ont une largeur limitée. Si vous le faites par exemple pour un GroupBox, vous ne pouvez redimensionner que sur une plus grande largeur et jamais redimensionner sur une plus petite.

Si vous avez plusieurs candidats pour la valeur de MinWidth, vous devez vous écrire un IMultiValueConverter, qui prend un objet [], l'analyse en flottants et renvoie le maximum (c'est juste 1 linq demandez si vous l'utilisez uniquement vous-même et n'avez pas besoin de gérer une mauvaise utilisation du convertisseur)

Cette méthode prend également en charge la modification dynamique de MinWidth.

19
Tomas Grosup

Ensemble Width = "Auto" en XAML.

Puis dans le code:

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

J'ai également eu des problèmes pour dimensionner correctement les colonnes de la grille à l'intérieur de la GridViewColumn. Il y a eu plusieurs choses que j'ai essayées mais j'ai trouvé le UniformGrid. C'était la solution ultime pour moi. Ça marche juste. Je ne le savais pas avant ... 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 à partir de ici .

2
Ollikat

Donnez un nom à la colonne dans le XAML:

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

Définissez ensuite la propriété MinWidth dans le code comme indiqué ci-dessous:

public MainWindow()
{
    InitializeComponent();

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