Pregunta

¿Cómo puedo obligar anchura vertical de WPF StackPanel que el artículo más estrecha que contiene. El ancho de la StackPanel no debe ser mayor que la anchura de cualquier otro elemento hijo.

¿Fue útil?

Solución

Por desgracia, el IValueConverter enfoque no siempre funciona; si los niños se añaden a StackPanel estáticamente, por ejemplo, la colección de niño va a estar vacío en el momento de la unión (por lo descubrí). La solución más sencilla es crear un panel personalizado:

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

Puede utilizar el panel como se ilustra en el siguiente XAML:

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

¿Qué hará que algo como lo siguiente:

ScreenShot

Espero que esto ayude.

Otros consejos

he intentado unirse a la propiedad ActualWidth, incluso la creación de un convertidor para compensar el valor, y esto funciona muy bien con una excepción: a medida que expande el tamaño del envase, el ancho se actualiza correctamente, pero cuando para hacer el envase más pequeño, el ancho del contenido real se hace más pequeño, pero el "ancho de página" de cualquier scrollviewers no lo hará. Estoy seguro de que hay una manera de solucionar este problema, pero yo no lo he encontrado.

No se puede. A StackPanel orientado verticalmente siempre asignará lo más ancho que solicitan sus hijos.

Usted sería mejor fuera de escribir un panel personalizado para lograr su comportamiento deseado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top