2013-09-10 5 views
1

J'ai une fenêtre qui utilise SizeToContent="WidthAndHeight" et j'ai une colonne qui contient trois lignes. Les lignes sont définit comme tel:WPF Sizing Grid.Roue au contenu

<Grid.RowDefinitions> 
    <RowDefinition /> 
    <RowDefinition /> 
    <RowDefinition /> 
</Grid.RowDefinitions> 

contenu est composé d'un autre panneau de grille par ligne au-dessus. Chacun de ces panneaux contient un label et un ListBox. ListBox ajoute ou supprime dynamiquement son contenu. Ainsi, il pourrait avoir un élément, ou il pourrait avoir 100 éléments.

Mon problème est le suivant: Lorsque mon application démarre, les trois lignes mentionnées ci-dessus sont dimensionnées en fonction du contenu qu'elles contiennent. Donc ça a l'air plutôt joli. Si la première ligne ne contient qu'un seul élément dans la zone de liste, elle le dimensionnera juste assez pour s'adapter à ces éléments. Les deux autres lignes (si elles sont surchargées de contenu) diviseront le reste de l'espace en deux et rendront leurs barres de défilement visibles si l'utilisateur veut voir les dépassements dans chacun d'eux. Cependant, dès que je redimensionne la fenêtre principale, les trois lignes se redimensionneront immédiatement à l'endroit où chacune aura exactement la même hauteur, peu importe la quantité de contenu qu'elles contiennent.

J'ai essayé d'utiliser Height="Auto" dans les définitions de lignes de la grille externe; cependant, cela dimensionne chaque ligne pour qu'elle s'adapte précisément au contenu, provoquant ainsi le débordement de l'écran, sans jamais activer les barres de défilement.

J'ai essayé tous les paramètres que je connais (clé: connaître) et je n'ai pas réussi à le résoudre. Pour l'instant, je me suis débarrassé de SizeToContent afin que ce bug bizarre ne se produise pas, mais les lignes sont proportionnées les unes aux autres, peu importe la quantité de contenu en eux ... et je voudrais dans l'autre sens. Je ne veux pas d'une hauteur statique pour chacune des rangées, mais plutôt d'avoir à les redimensionner dynamiquement, en fonction de la quantité de contenu qu'elles contiennent sans sortir de l'écran.

Y at-il un moyen de résoudre ce problème?

Répondre

1

Pour faire les choses correctement, vous devrez créer votre propre Panel personnalisé qui gère la distribution de taille plus intelligente que la norme Grid. Ce projet peut être un bon point de départ: ConstrainingStackPanel

+0

C'est un lien fantastique.C'est très semblable à ce que j'essaie d'accomplir. Il contient tout dans l'espace disponible. Merci beaucoup! –

1

Dans votre XAML vous pourriez lier à une propriété dans votre ViewModel

<Grid.RowDefinitions> 
    <RowDefinition Height="{Binding Row1Height}"/> 
    <RowDefinition Height="{Binding Row2Height}"/> 
    <RowDefinition Height="{Binding Row3Height}"/> 
</Grid.RowDefinitions> 

Puis dans votre ViewModel

public int Row1Height { get; set; } 
public int Row2Height { get; set; } 
public int Row3Height { get; set; } 

Et avoir un calcul qui renseigne cette valeur une fois que vous avez du contenu.

+0

On dirait une bonne idée. Beaucoup de travail en ce qui concerne le calcul, mais je n'ai rien trouvé d'autre qui puisse accomplir cela. –

0

En supposant que j'ai bien compris votre question, avez-vous essayé de l'emballer à l'intérieur d'un ScrollViewer et d'éteindre le Scollbar pour le ListView?

J'ai trouvé que le rendu de mise en page dans WPF peut être à la fois positif et une béquille. Il est parfois difficile de faire en sorte que cela fonctionne correctement quand il s'agit de dimensionnement du contenu. Si un ScrollViewer n'est pas une approche que vous aimeriez prendre, vous pourriez facilement accomplir quelque chose comme ça en écrivant un comportement attaché (je l'ai fait par le passé) mais dans ce cas, c'est trop compliqué.

Exemple d'approche ScrollViewer:

<Grid> 
    <ScrollViewer> 
     <ListView ItemsSource="{Binding Something}" ScrollViewer.VerticalScrollBarVisibility="Hidden"> 
    : 
    : 
    : 
    </ScrollViewer> 
</Grid> 
+0

J'ai essayé cette approche; cependant, si je les ajoute tous à ScrollViewer, je les ferai défiler tous les trois en même temps. Le problème avec cela est que si le premier a une tonne de contenu, les deux autres seront quelque part hors de l'écran. Je veux que tous les trois soient visibles en même temps. Si chacun est enveloppé dans ScrollViewer, des résultats similaires à ceux que j'avais précédemment se produisent. –

+0

Je vois ... si j'étais vous j'aurais probablement un coup d'oeil à l'écriture d'un comportement ci-joint pour gérer l'autosizing alors. Cela mettrait le contrôle total du calibrage entre vos mains. Je n'ai malheureusement pas les moyens de m'asseoir et de le faire maintenant. Je sais que c'est faisable cependant. – tronious