Respuesta corta
Start
, Center
, End
Y Fill
definir la vista de alineación dentro de su espacio .
Expand
define si ocupa más espacio si está disponible.
Teoría
La estructura LayoutOptions
controla dos comportamientos distintos:
Alineación: ¿Cómo se alinea la vista dentro de la vista principal?
Start
: Para la alineación vertical, la vista se mueve hacia arriba. Para la alineación horizontal, este suele ser el lado izquierdo. (Pero tenga en cuenta que en dispositivos con configuración de idioma de derecha a izquierda esto es al revés, es decir, alineado a la derecha).
Center
: La vista está centrada.
End
: Por lo general, la vista está alineada a la derecha o abajo. (En los idiomas de derecha a izquierda, por supuesto, alineados a la izquierda).
Fill
: Esta alineación es ligeramente diferente. La vista se extenderá a todo el tamaño de la vista principal.
Si el padre, sin embargo, no es más grande que sus hijos, no notará ninguna diferencia entre esas alineaciones. La alineación solo es importante para las vistas principales con espacio adicional disponible.
Expansión: ¿El elemento ocupará más espacio si está disponible?
- Sufijo
Expand
: si la vista principal es mayor que el tamaño combinado de todos sus elementos secundarios, es decir, hay espacio adicional disponible, entonces el espacio se distribuye entre las vistas secundarias con ese sufijo. Esos niños "ocuparán" su espacio, pero no necesariamente lo "llenarán". Echaremos un vistazo a este comportamiento en el siguiente ejemplo.
- Sin sufijo: los niños sin
Expand
sufijo no obtendrán espacio adicional, incluso si hay más espacio disponible.
Nuevamente, si la vista principal no es más grande que sus elementos secundarios, el sufijo de expansión tampoco hace ninguna diferencia.
Ejemplo
Echemos un vistazo al siguiente ejemplo para ver la diferencia entre las ocho opciones de diseño.
La aplicación contiene un gris oscuro StackLayout
con ocho botones blancos anidados, cada uno de los cuales está etiquetado con su opción de diseño vertical. Al hacer clic en uno de los botones, asigna su opción de diseño vertical al diseño de la pila. De esta forma, podemos probar fácilmente la interacción de las vistas con los padres, ambas con diferentes opciones de diseño.
(Las últimas líneas de código agregan cuadros amarillos adicionales. Volveremos a esto en un momento).
public static class App
{
static readonly StackLayout stackLayout = new StackLayout {
BackgroundColor = Color.Gray,
VerticalOptions = LayoutOptions.Start,
Spacing = 2,
Padding = 2,
};
public static Page GetMainPage()
{
AddButton("Start", LayoutOptions.Start);
AddButton("Center", LayoutOptions.Center);
AddButton("End", LayoutOptions.End);
AddButton("Fill", LayoutOptions.Fill);
AddButton("StartAndExpand", LayoutOptions.StartAndExpand);
AddButton("CenterAndExpand", LayoutOptions.CenterAndExpand);
AddButton("EndAndExpand", LayoutOptions.EndAndExpand);
AddButton("FillAndExpand", LayoutOptions.FillAndExpand);
return new NavigationPage(new ContentPage {
Content = stackLayout,
});
}
static void AddButton(string text, LayoutOptions verticalOptions)
{
stackLayout.Children.Add(new Button {
Text = text,
BackgroundColor = Color.White,
VerticalOptions = verticalOptions,
HeightRequest = 20,
Command = new Command(() => {
stackLayout.VerticalOptions = verticalOptions;
(stackLayout.ParentView as Page).Title = "StackLayout: " + text;
}),
});
stackLayout.Children.Add(new BoxView {
HeightRequest = 1,
Color = Color.Yellow,
});
}
}
Las siguientes capturas de pantalla muestran el resultado al hacer clic en cada uno de los ocho botones. Nosotros hacemos las siguientes observaciones:
- Mientras el padre
stackLayout
esté ajustado (no Fill
la página), la opción de diseño vertical de cada uno Button
es insignificante.
- La opción de diseño vertical solo es importante si
stackLayout
es más grande (por ejemplo, mediante Fill
alineación) y los botones individuales tienen el Expand
sufijo.
- El espacio adicional se distribuye eventualmente entre todos los botones con
Expand
sufijo. Para ver esto más claramente, agregamos líneas horizontales amarillas entre cada dos botones vecinos.
- Los botones con más espacio que la altura solicitada no necesariamente lo "llenan". En este caso, el comportamiento real está controlado por su alineación. Por ejemplo, están alineados en la parte superior, central o botón de su espacio o lo llenan por completo.
- Todos los botones abarcan todo el ancho del diseño, ya que solo modificamos el
VerticalOptions
.
Aquí encontrará las capturas de pantalla de alta resolución correspondientes.
FillAndExpand
es lo que quieres, el 99% del tiempoHay un pequeño error en la versión actual de Xamarin.Forms; Tal vez ha estado allí un tiempo.
CenterAndExpand
generalmente no se expande, y trabajar alrededor puede ser confuso.Por ejemplo, si tiene un
StackLayout
conjunto enCenterAndExpand
, entonces coloca una etiqueta dentro de ese conjunto yCenterAndExpand
también esperaría una etiqueta que sea de ancho completoStackLayout
. No No se expandirá Debe establecer elStackLayout
"FillAndExpand
" para que el objeto Label anidado se expanda al ancho completo delStackLayout
, luego dígale a la Label que centre el texto, no a sí mismo como un objeto, conHorizontalTextAlignment="Center"
. En mi experiencia, necesitas configurar tanto el padre como el hijo anidadoFillAndExpand
si realmente quieres asegurarte de que se expanda para adaptarse.fuente
Expand
solo se usa para niños de StackLayout. Por lo tanto, si su StackLayout es la raíz, o no en otro StackLayout,Expand
no tiene ningún efecto. En cambio, cualquier opción que no sea Relleno actuaría como un "contenido de ajuste" para el dimensionamiento, que es lo que ve.Falko dio una buena explicación, pero quería agregar a eso con otro visual y cómo funcionan estas etiquetas en xaml, que es lo que prefiero usar la mayor parte del tiempo. Hice un proyecto simple para probar los resultados de la pantalla. Aquí está el Xaml para la página principal:
Como puede ver, es un StackLayout muy simple con una etiqueta dentro. Para cada imagen a continuación, mantuve el StackLayout igual, solo cambié las opciones horizontales y verticales para la Entrada y cambié el texto para mostrar las opciones seleccionadas, para que pueda ver cómo se mueve y cambia el tamaño de la Entrada.
Aquí está el código utilizado para Inicio:
Y el código utilizado para StartAndExpand:
Como puede ver, no hay diferencia visual, aparte de que se usa más texto en la opción StartAndExpand. Esto fue probado en mi dispositivo físico Samsung A30. Estos pueden mostrarse de manera diferente en diferentes dispositivos, pero creo que todas las imágenes aquí muestran colectivamente que hay algunos errores en Xamarin. Por lo demás, solo mostraré las capturas de pantalla, creo que se explican por sí mismas.
También recomiendo echar un vistazo a la documentación de Microsoft para obtener algunos detalles adicionales. Cabe destacar que "La expansión solo la usa un StackLayout".
fuente