2016-12-20 1 views
1

Comment puis-je dire à une zone de liste déroulante de ne pas influencer la largeur de colonne de la grille dans laquelle elle se trouve?WPF ComboBox n'influence pas la largeur de colonne

Voici un exemple minimal:

<StackPanel Orientation="Vertical"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="5"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Label>This is some text</Label> 
     <Label Grid.Row="1">This is some text</Label> 
     <GridSplitter Grid.Column="1" Grid.RowSpan="2" HorizontalAlignment="Stretch"/> 
     <Label Grid.Column="2" Background="Beige" HorizontalAlignment="Right">This is some text</Label> 
     <ComboBox Grid.Row="1" Grid.Column="2"> 
      <ComboBoxItem IsSelected="True">This is some text</ComboBoxItem> 
      <ComboBoxItem>This is some really lengthy text that is really long</ComboBoxItem> 
     </ComboBox> 
    </Grid> 
</StackPanel> 

Le ComboBox change de taille lorsque le deuxième élément est sélectionné, et avec elle, la taille de la troisième colonne est modifiée (comme on le voit par le beige fond de l'étiquette). enter image description here

Cela a aussi l'effet du texte dans l'étiquette beige parfois être en dehors de la zone visible, même si il y a suffisamment d'espace pour afficher complètement:

enter image description here

Ce que je veux est que la troisième colonne a toujours la largeur de l'étiquette beige (ou tout autre élément qui est dans la colonne et n'est pas un ComboBox), et le ComboBox raccourcit son texte afin qu'il corresponde à cette largeur. La partie popup de la ComboBox peut être plus grande, je parle juste de la partie bouton ici. J'ai essayé de mettre en place un ComboBox avec TextBlock Content et TextTrimming mis à CharacterEllipsis, mais en vain.

+0

Définissez la propriété 'Width' du' ComboBox', ou définissez 'Width' du' ColumnDefinition' à une valeur fixe – user1994514

+0

Mais ce n'est pas ce que je veux. J'ai mis le GridSplitter là, parce que c'est dans mon exemple original. L'exigence est que le ComboBox est aussi large que tous les autres éléments de la colonne. – Flash

+0

Quels autres éléments? –

Répondre

2

Ici cela devrait le faire pour vous:

<StackPanel Orientation="Vertical"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="5"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Label>This is some text</Label> 
     <Label Grid.Row="1">This is some text</Label> 
     <GridSplitter Grid.Column="1" Grid.RowSpan="2" HorizontalAlignment="Stretch"/> 
     <Label x:Name="Label" Grid.Column="2" Background="Beige" HorizontalAlignment="Right">This is some text</Label> 
     <ComboBox Grid.Row="1" Grid.Column="2" Width="{Binding ElementName=Label, Path=ActualWidth, Mode=OneWay}"> 
      <ComboBoxItem IsSelected="True">This is some text</ComboBoxItem> 
      <ComboBoxItem>This is some really lengthy text that is really long</ComboBoxItem> 
     </ComboBox> 
    </Grid> 
</StackPanel> 
+0

Cela fonctionne dans l'exemple, merci. Comme dans ma vraie application, toute la colonne est créée au moment de l'exécution, ce n'est pas si simple, mais je suppose que je dois écrire du code-behind qui choisit un contrôle aléatoire non-ComboBox dans cette colonne et s'y lie. – Flash

+0

Juste pour donner une conclusion, je viens d'implémenter le code-behind que j'ai mentionné ci-dessus dans mon vrai code, et cela fonctionne comme requis, alors merci encore. – Flash

+0

@Flash Pas de problème, content que cela ait aidé. –

0

Définissez MaxWidth du contrôle de zone de liste déroulante. Cela permettra à la zone de liste déroulante de passer à cette valeur. Si vous voulez une largeur fixe, vous devez définir la propriété width de la zone de liste déroulante.

+0

Ce n'est pas ce que je veux. Le ComboBox doit être aussi large que tous les autres éléments de la colonne et non une valeur fixe. Quels éléments sont dans la colonne (pas dans mon exemple minimal) est décidé au moment de l'exécution. – Flash

+0

Ensuite, vous faites ce qui suit définir la largeur de la colonne avec * et définir la liste déroulante HorizontalAlignment = "Stretch". – Rudra

0

Vous pouvez utiliser la propriété Largeur de Combobox comme

<ComboBox Grid.Row="1" Grid.Column="2" Width="200"> 

emballage texte aussi peut vous aider, lien suivant a un exemple à la façon dont vous pouvez utiliser l'habillage de texte pour combobox: ComboBox TextWrap Binding

+0

Encore une fois, ce n'est pas ce que je veux. L'exigence est que la zone de liste déroulante est exactement aussi large que la colonne mais n'influence pas la taille de la colonne. Aucune largeur fixe n'est autorisée. – Flash

0

est Ci-dessous le code pour votre référence

<Grid.ColumnDefinitions> 
 
      <ColumnDefinition Width="*"></ColumnDefinition> 
 
      <ColumnDefinition Width="4*"></ColumnDefinition> 
 
     </Grid.ColumnDefinitions> 
 

 
     <ComboBox HorizontalAlignment="Stretch" Grid.Column="1">