2012-08-27 30 views
42

Mam następujący kod:Wyrównywanie kontrole zarówno na lewej i prawej stronie w panelu stosu w 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> 
    ... 

Przycisk radiowy powinien być umieszczony po lewej stronie w panelu stosu (I usunięte niektóre przyciski nie zaśmiecają przykładu), a etykieta (którą umieszczam tymczasowo w zagnieżdżonym StackPanelu) powinna znajdować się po prawej stronie.

Próbowałem już wiele kombinacji linii trasowania, ale nie mogę uzyskać etykiety po prawej stronie. Co powinienem dodać, aby to osiągnąć?

+2

Naprawdę nie można prosić zbyt wiele płyt kominowych, jak tylko chcesz wszelkiego rodzaju pół-zaawansowanej konstrukcji po prostu pójść na siatce –

+5

Prawidłowa odpowiedź jest użycie DockPanel jak w tym poście: http://stackoverflow.com/questions/2023201/align-items-in-a-stack-panel – pasx

Odpowiedz

61

Tylko nie używaj StackPanel, StackPanelsstosu. Z oczywistych względów nie pozwalają na wyrównanie w kierunku, w którym się układają. Użyj Grid, z definicji kolumn tak:

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

Myślę, że to zadziała, jednak będę czekał na więcej odpowiedzi, ponieważ dzięki StackPanels mam tę zaletę, że gdy ekran jest mniej szeroki, elementy się zawijają, które tracę, kiedy używam krata. –

+2

@MichelKeijzers: Jeśli chcesz czegoś takiego, być może trzeba będzie zaimplementować własny panel. –

+0

Dzięki za odpowiedź ... Nie wiem, czy wolę twoje rozwiązanie dotyczące niedopasowania w tym przypadku, ale to jest poza pytaniem, które zadałem. –

2

Po ustawieniu wartości StackPanel na Horizontal, właściwość HorizontalAlignment nie będzie działać na elementach potomnych. Jeśli potrzebujesz dodatkowych elementów sterujących, możesz zachować StackPanel, ale polecam przełączyć na Grid (między innymi), aby zbudować odpowiedni układ.

Również Grid pozwoli Ci kontrolować rzeczywistą szerokość każdej kolumny:

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

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

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

+1

Twój pierwszy przykład nie zadziała, nadal będzie układać się w stosach w poziomie, tak jak pozwala na to miejsce, a wyrównanie nic nie da. –

+0

@KDiTraglia Tak, po prostu przetestowane - masz rację; Kiedy 'Orientacja =" Poziomo "", ignoruje 'PoziomaAligacja'; usuwanie teraz, dzięki =] – newfurniturey

11

Mimo że jest to stary, powinien ktoś natknąć się to tak jak ja, tutaj jest proste rozwiązanie.

Utwórz nową siatkę, a wewnątrz tej siatki ułóż dwa panele stosów o różnych poziomych ustawieniach.

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

Możliwym problemem jest to, że teraz bez dodatkowej obsługi mogą się nakładać na siebie.

+0

Działa dobrze dla mnie i jest dość proste. – gbdavid

0

Użytkownik @ pasx ma rację. Powinieneś użyć DockPanel i zadokować RadioButton po lewej stronie, a swój StackPanel z etykietą po prawej stronie.

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