Frage

Wie kann ich eine vertikale WPF StackPanel Breite an den schmalsten Punkt beschränken sie enthält. Die Breite des StackPanel darf nicht größer sein als die Breite jedes andere Kind-Element.

War es hilfreich?

Lösung

Leider ist die IValueConverter Ansatz wird nicht immer funktionieren; wenn die Kinder zu hinzugefügt Stackpanel statisch, zum Beispiel, wird das Kind Sammlung zum Zeitpunkt der Bindung leer sein (so entdeckte ich). Die einfachste Lösung ist eine eigene Platte zu erstellen:

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);
    }
}

Sie können das Panel verwenden, wie durch die folgende XAML dargestellt:

<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>

Welche etwa wie folgt machen wird:

Screenshot

Ich hoffe, das hilft.

Andere Tipps

ich versucht habe zu der Actual Eigenschaft verbindlich, auch einen Konverter zu schaffen, den Wert zu versetzen, und das funktioniert gut mit einer Ausnahme: wenn Sie die Größe des Behälters erweitern, wird die Breite korrekt aktualisiert, aber wenn, um den Behälter zu machen kleiner, wird die Breite des tatsächlichen Inhalts kleine, aber die „Seitenbreite“ von irgendwelchen scrollviewers nicht. Ich bin sicher, es ist ein Weg, dies zu umgehen, aber ich habe es nicht gefunden.

Sie können nicht. Eine vertikal orientierte StackPanel wird immer so viel Breite zuteilen als seine Kinder beantragen.

Sie würden am besten aus einer benutzerdefinierten Panel Schreiben Sie Ihr gewünschtes Verhalten zu erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top