2012-02-08 5 views
12

Il doit y avoir une solution élégante à ce problème, mais je ne trouve rien en ligne. J'ai une grille qui a une colonne et une ligne avec largeur/hauteur *, contenant un ListBox. J'ai mon Window SizeToContents défini sur WidthAndHeight pour permettre à la fenêtre de redimensionner à la bonne taille pour chaque ensemble de widgets/polices UI. Lorsque j'ajoute des éléments à la ListBox, il redimensionne, provoquant la croissance de la fenêtre. Je veux que la ListBox soit redimensionnée si je change la taille de la fenêtre, mais si j'ajoute un contenu plus long que la largeur de la ListBox, je veux que la barre de défilement apparaisse et non pour qu'elle grandisse, provoquant la fenêtre grandir. Si je définis des tailles explicites pour la fenêtre et définissez SizeToContent sur Manual (la valeur par défaut), cela fonctionne comme je l'ai prévu.Obtenir ListBox à redimensionner avec la fenêtre, mais pas redimensionner avec le contenu

Existe-t-il un moyen de redimensionner la fenêtre au contenu au démarrage et de continuer à augmenter le ListBox avec la taille de la fenêtre, mais pas avec son contenu?

+3

avoir le même problème, mais à l'intérieur d'une grille avec la hauteur réglable via un GridSplitter. Ajouter des éléments à la liste augmente la liste et déplace le séparateur plutôt que de faire défiler. –

Répondre

0

Pour faire ListBox redimensionner lorsque vous modifiez la taille de la fenêtre simplement utiliser:

<ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" .../> 

Pour activer le défilement dans votre zone de liste, vous pouvez trouver une réponse ici parce que le modèle par défaut de la zone de liste comprend un ScrollViewer.

How can I get a vertical scrollbar in my ListBox?

1

Ce comportement est prévu pour résultat de définir la propriété SizeToContent à WidthAndHeight comme described here. Ce que vous pouvez faire est de lier la largeur et la hauteur de la ListBox aux propriétés ActualWidth et ActualHeight de son conteneur, ou utiliser un convertisseur et les lier directement aux propriétés respectives de la fenêtre.

2

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

0

J'espère que vous avez l'exigence ci-dessous, 1) ListBox doit utiliser la barre de défilement, il la taille de son contenu devient plus grand que l'original.

2) Si la fenêtre est redimensionnée, ListBox devrait croître/rétrécir avec Window.

J'ai essayé la même chose avec un exemple simple, s'il vous plaît vérifier et si elle diffère de votre exigence, laissez-moi savoir,

code XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <TextBlock Text="I am in Main Grid"/> 
     <ListBox Grid.Row="1" BorderBrush="BlueViolet" BorderThickness="5" Margin="10"> 
      <TextBlock Text="I am a ListBox"/> 
      <Button Content="Add Height and Width of ListBox by 100 pixels" Click="Button_Click"/> 
      <ListBoxItem Content="ListBoxItem" Background="AliceBlue" Margin="10" BorderBrush="Blue" Width="{Binding ListBoxWidth}" Height="{Binding ListBoxHeight}"/> 
     </ListBox> 
    </Grid> 
</Window> 

code C#:

public partial class MainWindow : Window,INotifyPropertyChanged 
{ 
    private int m_ListBoxWidth = 350; 

    public int ListBoxWidth 
    { 
     get { return m_ListBoxWidth; } 
     set 
     { 
      m_ListBoxWidth = value; 
      OnPropertyChanged("ListBoxWidth"); 
     } 
    } 

    private int m_ListBoxHeight = 150; 

    public int ListBoxHeight 
    { 
     get { return m_ListBoxHeight; } 
     set 
     { 
      m_ListBoxHeight = value; 
      OnPropertyChanged("ListBoxHeight"); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     ListBoxWidth += 190; 
     ListBoxHeight += 140; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
1

En suivant la suggestion de Potecaru Tudor, j'ai résolu un problème similaire en enveloppant le ListBox dans un autre conteneur et en liant la hauteur de la ListBox à l'ActualHeight du conteneur.

Voici un extrait de code XAML pour aider:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Border x:Name="HeightHelperPanel" Grid.Row="0"> 
     <ListBox ItemsSource="{Binding Path=FileNameCollection}" 
       MinHeight="60" 
       Height="{Binding Path=ActualHeight, ElementName=HeightHelperPanel}"/> 
    </Border> 
</Grid> 

Fondamentalement, le conteneur de la frontière ne pousse pas quand son contenu se développe, mais il va rester tendu à la hauteur de la ligne de la grille. La ligne de grille remplira tout espace que la fenêtre contenant le permettra, mais ne voudra pas forcer les contraintes de hauteur sur la fenêtre. La hauteur de ListBox est donc limitée à la hauteur de la bordure.

Espérons que cela aide quelqu'un d'autre qui a eu ce problème un peu frustrant.

Questions connexes