2012-08-27 24 views
42

tengo el siguiente código:Alineación de los controles en ambos lados izquierdo y derecho en un panel de pila en WPF

<DockPanel> 
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal"> 
     <RadioButton Content="_Programs" 
        IsChecked="{Binding Path=ProgramBanksSelected}" IsEnabled="{Binding Path=ProgramsEnabled}" Margin="8" /> 
     <StackPanel> 
      <Label Content="Master" Height="28" Name="MasterFileStatus" VerticalContentAlignment="Center"/> 
     </StackPanel> 
    </StackPanel> 
    ... 

El botón de opción debe ser colocado en el lado izquierdo del panel de pila (I eliminado algunos botones de no abarrote el ejemplo) y la etiqueta (que puse temporalmente en un StackPanel anidado) debe estar en el lado derecho.

Probé muchas combinaciones de alineaciones pero no puedo obtener la etiqueta en el lado derecho. ¿Qué debo agregar para lograr esto?

+2

Realmente no se puede pedir demasiado de los paneles de la pila, tan pronto como se desea cualquier tipo de estructura semi-avanzada ir a por una rejilla –

+5

La respuesta correcta es utilizar un DockPanel como en este post: http://stackoverflow.com/questions/2023201/align-items-in-a-stack-panel – pasx

Respuesta

61

simplemente no lo utiliza un StackPanel, StackPanelspila. Lo hacen, por razones obvias, no permiten la alineación en la dirección en la que se amontonan. Utilice un Grid, con las definiciones de columnas de este modo:

<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="*" /> 
    <ColumnDefinition Width="Auto" /> 
</Grid.ColumnDefinitions> 
+0

Supongo que funcionaría, sin embargo, esperaré por más respuestas, porque con StackPanels tengo la ventaja de que cuando la pantalla se hace menos ancha, los artículos se cerrarán, lo que pierdo cuando uso un cuadrícula. –

+2

@MichelKeijzers: si quieres algo así de sofisticado, deberás implementar tu propio panel. –

+0

Gracias por la respuesta ... No sé si prefiero su solución sobre la alineación incorrecta en ese caso, pero eso está fuera de la pregunta que hice. –

2

Como ha establecido la orientación StackPanel en Horizontal, la propiedad HorizontalAlignment no funcionará en los elementos secundarios. Puede mantener el StackPanel si necesita controles adicionales, aunque recomendaría cambiar a Grid (entre otras cosas) para crear el diseño que desea.

Además, el Grid le permitirá controlar el ancho real de cada columna:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="50" /> 
     <ColumnDefinition Width="150" /> 
    </Grid.ColumnDefinitions> 

    <RadioButton 
     Grid.Column="0" 
     ... 
    /> 

    <Label 
     Grid.Column="1" 
     ... 
    /> 
</Grid> 

+1

Su primer ejemplo no funcionará, todavía se acumulará horizontalmente según lo permita el espacio y la alineación no hará nada. –

+0

@KDiTraglia Sí, recién probado, tienes razón; Cuando 'Orientation =" Horizontal "', ignora el 'HorizontalAlignment'; eliminando ahora, gracias =] – newfurniturey

11

pesar de que esto es viejo, si alguien venir a través de este como lo hice, he aquí una solución sencilla.

Haz una nueva cuadrícula y dentro de esa cuadrícula coloca dos paneles de pila con diferentes Alineaciones horizontales.

<Grid> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> 
     <!--Code here--> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> 
     <!--Code here--> 
    </StackPanel> 
</Grid> 

El posible problema es que ahora sin un manejo adicional, los dos podrían superponerse entre sí.

+0

Funciona bien para mí y es lo suficientemente simple. – gbdavid

0

El usuario @pasx tiene razón. Debe usar DockPanel y acoplar RadioButton en el lado izquierdo, y su StackPanel con la etiqueta en el lado derecho.

<DockPanel> 

    <DockPanel 
     DockPanel.Dock="Top" 
     LastChildFill="False" > 

     <RadioButton 
      DockPanel.Dock="Left" 
      Content="_Programs" 
      IsChecked="{Binding Path=ProgramBanksSelected}" 
      IsEnabled="{Binding Path=ProgramsEnabled}" 
      Margin="8" /> 

     <StackPanel 
      DockPanel.Dock="Right"> 

      <Label 
       Content="Master" 
       Height="28" 
       Name="MasterFileStatus" 
       VerticalContentAlignment="Center"/> 

     </StackPanel> 

    </DockPanel> 
    ... 
Cuestiones relacionadas