¿Cómo puede un StackPanel de WPF llenarse verticalmente de abajo hacia arriba?
dockpanel wpf (7)
Necesito poder llenar un stackpanel
con buttons
pero los botones deben aparecer primero en la parte inferior del panel de distribución y rellenar hacia arriba . Los botones se crean dinámicamente y hay un número desconocido de ellos, por lo que el hackeo visual simplemente no funcionará. Intenté experimentar con alineamientos verticales pero fue en vano.
Al igual que:
<StackPanel VerticalAlignment="Bottom">
...
</StackPanel>
y para llenar con botones hacia arriba, debe insertar los botones en la posición 0, en lugar de agregarlos.
La mejor forma de resolver el problema es implementar un contenedor personalizado derivado de un panel de distribución pero una solución rápida y sucia si se agregan elementos en el tiempo de ejecución es
public Window1()
{
InitializeComponent();
for (int i = 0; i < 10; i++)
{
Button btn = new Button();
btn.Content = "Button " + i;
MyStack.Children.Insert(0, btn);
}
}
Simplemente inserte el artículo en la posición 0 en lugar de agregarlos.
Otra alternativa es usar un DockPanel en su lugar.
Simplemente configure LastChildFill en false en DockPanel.
A continuación, configure la propiedad Dock adjunta a cada botón que está agregando a Bottom antes de agregarlo al DockPanel.
ejemplo:
var button = new Button();
DockPanel.SetDock(button, Dock.Bottom);
Trate de colocar el StackPanel dentro de otro contenedor (no un StackPanel, tal vez un DockPanel) y alineándolo por la parte inferior. Luego, cuando llene los botones, coloque cada uno nuevo en la primera posición.
Descubrí que el uso de una UniformGrid con Column = 1 proporciona una pila de relleno ordenada, o establece que las Filas = 1 den una ordenada pila horizonatalmente llena. Y agregar desde el índice 0 funcionará de abajo arriba.
O puede girar el StackPanel 180 grados para que los botones se apilen desde abajo hacia arriba y luego gire los botones 180 grados para volver a colocarlos boca arriba:
<StackPanel>
<!-- rotate all buttons inside this panel -->
<StackPanel.Resources>
<Style TargetType="Button">
<Setter Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="180"/>
</Setter.Value>
</Setter>
</Style>
</StackPanel.Resources>
<!-- rotate the stack panel -->
<StackPanel.LayoutTransform>
<RotateTransform Angle="180"/>
</StackPanel.LayoutTransform>
<!-- content -->
<Button>1</Button>
<Button>2</Button>
</StackPanel>
Amo la solución de transformaciones de Nir. Me preguntaba si se podría hacer usando transformaciones.
Una advertencia, sin embargo: no use el truco de las transformaciones en un control basado en ScrollView como un ListBox porque la operación de la barra de desplazamiento se invertirá desde el contenido. Hilarante de ver, siempre y cuando no seas el usuario final. ;>