2010-09-12 17 views
4

J'ai mis un ListView dans la rangée du milieu d'une vue. La vue est contenue dans une fenêtre dont SizeToContent est défini sur WidthAndHeight. Le ListView est initialement vide, mais le ViewModel sous-jacent remplit cette vue de liste dans le processus.Comment empêcher une ListView d'étendre la dimension de la fenêtre?

La hauteur moyenne de Grid.Row est définie sur * pour remplir la taille disponible de la fenêtre. Lorsque ListView reçoit de nouveaux éléments, il agrandit la fenêtre au lieu d'afficher ScrollViewer dans ListView. Comment puis-je empêcher ce comportement que SizeToContent soit défini sur WidthAndHeight, la hauteur Grid.Row sur * mais que ListView ne développe pas les dimensions de la fenêtre?

Voici le code de la fenêtre (la propriété de l'espace de travail contiendra le ViewModel):

<Window x:Class="Views.ContainerWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="{Binding Title}" 
     SizeToContent="WidthAndHeight"> 
    <ContentControl Content="{Binding Workspace}"/> 
</Window> 

La vue de la condition ViewModel ressemble à ceci:

<UserControl x:Class="Views.SomeView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      MinHeight="450"> 
    <Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Row="0" 
       TextWrapping="Wrap" 
       Margin="5" 
       Text="Some description text"/> 
     <ListView Grid.Row="1" 
       ItemsSource="{Binding ItemsList}" 
       Margin="5"> 
     <ListView.View> 
      <GridView> 
       ... 
      </GridView> 
     </ListView.View> 
     </ListView> 
     <Button Grid.Row="2" 
       HorizontalAlignment="Right" 
       Command" Value="{Binding CloseCommand}"/> 
    </Grid> 
</UserControl> 

Répondre

4

Désactiverait-il l'autosizing de la fenêtre après qu'elle ait chargé le travail pour vous?

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.SizeToContent = SizeToContent.Manual; 
    } 
+0

Merci. C'est en fait la solution que j'ai utilisée. Vous pouvez le voir, si vous développez les commentaires ci-dessus. :) –

+0

@Ninfendo: +1 C'est méchant, merci. J'ai perdu un après-midi à essayer de comprendre cela. – TarkaDaal

1

Vous devrez limiter un des éléments de taille dynamique dans la hiérarchie. C'est à dire. définir maximumheight/maximumwith ou les propriétés height/with du windown, du grid ou du listboxt à une valeur appropriée.

+0

Je préfère ne pas le faire. Je cherche un moyen de ne pas laisser le ListView se développer, si des éléments sont ajoutés. –

+0

J'essayais de lier la hauteur ListView ou la hauteur maximale à la hauteur actuelle de la Grid.Row du milieu, mais cela n'a pas aidé. –

+1

Eh bien, vous aurez besoin de restreindre quelque chose. Si la liste peut croître, vous ne verrez pas le panneau de défilement. Mais la croissance incontrôlée de la lisbox conduit à une croissance sans restriction de la fenêtre. Attrape Typlical 22. Donc, à mon humble avis, en utilisant une taille maximale pour la fenêtre ou la lisbox, vous obtiendrez là où vous voulez - rendre la fenêtre aussi petite que possible, mais si elle devient trop grande, une barre de défilement apparaît sur la liste. – AxelEckenberger