Question

Comment puis-je limiter la largeur d'une StackPanel WPF verticale à l'élément le plus étroit qu'il contient. La largeur de la StackPanel ne doit pas être supérieure à la largeur de tout autre élément enfant.

Était-ce utile?

La solution

Malheureusement IValueConverter approche ne fonctionnera pas toujours; si les enfants sont ajoutés à StackPanel statiquement, par exemple, la collection des enfants sera vide au moment de la liaison (donc j'ai découvert). La solution la plus simple est de créer un panneau personnalisé:

public class ConstrainedStackPanel : StackPanel
{
    public ConstrainedStackPanel()
    {
    }

    protected override Size MeasureOverride(Size constraint)
    {
        foreach (var item in this.Children)
        {
            // FrameworkElement has the Width property we care about.
            FrameworkElement element = item as FrameworkElement;
            if (element != null)
                constraint.Width = Math.Min(element.Width, constraint.Width);
        }

        return base.MeasureOverride(constraint);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        foreach (var item in this.Children)
        {
            // FrameworkElement has the Width property we care about.
            FrameworkElement element = item as FrameworkElement;
            if (element != null)
                arrangeSize.Width = Math.Min(element.Width, arrangeSize.Width);
        }

        return base.ArrangeOverride(arrangeSize);
    }
}

Vous pouvez utiliser le panneau comme illustré par le XAML suivant:

<StackPanel Margin="5">
    <TextBlock Text="StackPanel:" FontWeight="Bold" />
    <StackPanel x:Name="panelA">
        <Button Width="100" Content="100" />
        <Button Width="200" Content="200" />
        <Button Width="300" Content="300" />
        <Button Width="400" Content="400" />
    </StackPanel>
    <TextBlock Text="ConstrainedStackPanel:" FontWeight="Bold" Margin="0,10,0,0" />
    <l:ConstrainedStackPanel x:Name="panelB">
        <Button Width="100" Content="100" />
        <Button Width="200" Content="200" />
        <Button Width="300" Content="300" />
        <Button Width="400" Content="400" />
    </l:ConstrainedStackPanel>
</StackPanel>

Ce qui va rendre quelque chose comme ce qui suit:

ScreenShot

J'espère que cette aide.

Autres conseils

J'ai essayé lier à la propriété ActualWidth, créant même un convertisseur pour compenser la valeur, et cela fonctionne très bien à une exception près: que vous développez la taille du conteneur, la largeur est mis à jour correctement, mais quand faire le récipient plus petite, la largeur du contenu réel devient plus petit, mais la « largeur de la page » de toute scrollviewers ne sera pas. Je suis sûr qu'il ya un moyen de contourner ce problème, mais je ne l'ai pas trouvé.

Vous ne pouvez pas. Un StackPanel orienté verticalement toujours affecter autant la largeur que ses enfants demandent.

Vous seriez mieux loti écrire un panneau personnalisé pour obtenir votre comportement souhaité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top