Saltar al contenido

En WPF, ¿hay alguna manera de hacer un StackPanel con columnas alineadas como una cuadrícula?

Solución:

Aquí hay una clase que reuní aproximadamente con el mismo propósito; esencialmente, quería poder poner un montón de etiquetas en la columna de la izquierda y valores de diferentes tipos (cuadro de texto, menú desplegable, etc.) a la derecha.

Solo tiene dos columnas, pero podría adaptarse a diferentes números.

public class LabelValueGrid : Grid
{
    public LabelValueGrid()
        : base()
    {
        ColumnDefinitions.Add(new ColumnDefinition());
        ColumnDefinitions.Add(new ColumnDefinition());
        ColumnDefinitions[0].Width = new System.Windows.GridLength(1, System.Windows.GridUnitType.Auto);
        ColumnDefinitions[1].Width = new System.Windows.GridLength(1, System.Windows.GridUnitType.Star);
    }

    protected override void OnVisualChildrenChanged(System.Windows.DependencyObject visualAdded, System.Windows.DependencyObject visualRemoved)
    {
        base.OnVisualChildrenChanged(visualAdded, visualRemoved);

        int curRow = -1;
        int curCol = 1;

        RowDefinitions.Clear();

        if (Children != null)
            foreach (System.Windows.UIElement curChild in Children)
            {
                if (curCol == 0)
                    curCol = 1;
                else
                {
                    curCol = 0;
                    curRow++;
                    RowDefinitions.Add(new RowDefinition() {Height = new System.Windows.GridLength(1, System.Windows.GridUnitType.Auto)});
                }

                Grid.SetRow(curChild, curRow);
                Grid.SetColumn(curChild, curCol);
            }

        RowDefinitions.Add(new RowDefinition() {Height = new System.Windows.GridLength(1, System.Windows.GridUnitType.Star)});
    }
}

Puedo usar esto como una cuadrícula, excepto que solo enumero los controles y luego alterna las columnas automáticamente:

<local:LabelValueGrid>
    <TextBlock Text="Label1"/>
    <TextBox Name="value1"/>
    <TextBlock Text="Label2"/>
    <TextBox Name="value2"/>
</local:LabelValueGrid>

Podrías usar muchos de una fila Grids con tamaño compartido en las columnas. Se vuelve detallado cuando se hace sin ningún control, por lo que podría encapsular algo de lógica (como crear columnas y asignar Grid.Column) en una derivada de ItemsControl o una propiedad adjunta, por ejemplo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *