Allineare gli elementi in un pannello stack?


148

Mi chiedevo se posso avere 2 controlli in uno StackPanel orientato orizzontalmente in modo che l'elemento giusto debba essere ancorato sul lato destro dello StackPanel.

Ho provato quanto segue ma non ha funzionato:

<StackPanel Orientation="Horizontal">
    <TextBlock>Left</TextBlock>
    <Button Width="30" HorizontalAlignment="Right">Right<Button>
</StackPanel>

Nel frammento sopra voglio che il Button sia ancorato sul lato destro di StackPanel.

Nota: ho bisogno che sia fatto con StackPanel, non Grid ecc.


Non menzioni esplicitamente alcuna griglia, ma è esattamente così che l'ho realizzato. Sarò interessato a vedere se qualcun altro ha una risposta senza griglia per la tua domanda che si adatta alle mie esigenze.
JMD,

sì, qualcuno mi ha appena dato un progetto pieno di pannelli stack in questo modo, è così che vuole che sia risolto.
Shimmy Weitzhandler

3
So che è (estremamente) in ritardo, ma non potresti mettere un pannello di controllo all'interno del pannello di controllo?
Kian,

1
@Kian, hai perfettamente ragione con il tuo commento, ci ho pensato io, ci ho provato e ha funzionato perfettamente.
Gabrielius,

Risposte:


221

Puoi farlo con un DockPanel:

<DockPanel Width="300">
    <TextBlock>Left</TextBlock>
    <Button HorizontalAlignment="Right">Right</Button>
</DockPanel>

La differenza è che a StackPanelsistemerà gli elementi figlio in una linea singola (verticale o orizzontale) mentre a DockPaneldefinisce un'area in cui è possibile disporre gli elementi figlio in senso orizzontale o verticale, l'uno rispetto all'altro (la Dockproprietà cambia la posizione di un elemento rispetto all'altro) elementi all'interno dello stesso contenitore. Le proprietà di allineamento, ad esempio HorizontalAlignment, modificano la posizione di un elemento rispetto al suo elemento padre).

Aggiornare

Come sottolineato nei commenti puoi anche usare la FlowDirectionproprietà di a StackPanel. Vedi la risposta di @ D_Bester .


1
questo è ciò che intendevo con "ecc." Immagino che la risposta sia no, e dovrò farlo nel modo più duro, leggi il mio commento per JMD sopra
Shimmy Weitzhandler

Bene, StackPanel semplicemente non può fare il layout che desideri. Una griglia ti darà la massima flessibilità, ma un passaggio da StackPanel a DockPanel non sembra troppo difficile.
Dirk Vollmar,

2
Non esiste DockPanel in Windows 8, altre soluzioni?
Christoph,

@DirkVollmar In realtà StackPanel funziona abbastanza bene, vedi la mia risposta.
D_Bester,

1
se si vuole lasciare l'articolo align diritto più, insieme LastChildFill="False"cioè <DockPanel LastChildFill="False">, vedere stackoverflow.com/a/9599290/4573839
Yu Yang Jian

68

Yo possibile impostare FlowDirectiondi Stack panela RightToLeft, e quindi tutti gli articoli saranno allineati al lato destro.


3
Si noti tuttavia che ciò modifica (inverte) l'ordine dei controlli in StackPanel.
rumblefx0,

1
@slattery Se FlowDirection è un problema, basta inserire un altro StackPanel e specificare FlowDirection. Vedi la mia risposta
D_Bester,

1
@ rumblefx0: nota, DockPanel inverte anche l'ordine dei controlli, se sono ancorati a destra o in basso. Questo perché il primo controllo viene ancorato per primo.
Olivier Jacot-Descombes,

29

Per coloro che si imbattono in questa domanda, ecco come ottenere questo layout con un Grid:

<Grid>
    <TextBlock Text="Server:"/>
    <TextBlock Text="http://127.0.0.1" HorizontalAlignment="Right"/>
</Grid>

crea

Server:                                                                   http://127.0.0.1

18

Non riuscivo a farlo funzionare usando un DockPanel come volevo e invertire la direzione del flusso di uno StackPanel è problematico. L'uso di una griglia non è un'opzione in quanto gli elementi al suo interno possono essere nascosti in fase di esecuzione e quindi non conosco il numero totale di colonne in fase di progettazione. La soluzione migliore e più semplice che potrei trovare è:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <StackPanel Grid.Column="1" Orientation="Horizontal">
        <!-- Right aligned controls go here -->
    </StackPanel>
</Grid>

Ciò comporterà l'allineamento dei controlli all'interno dello StackPanel sul lato destro dello spazio disponibile, indipendentemente dal numero di controlli, sia in fase di progettazione che in fase di esecuzione. Sìì! :)


Se FlowDirection è un problema, basta inserire un altro StackPanel e specificare FlowDirection. Vedi la mia risposta
D_Bester,

Penso che questa sia una soluzione molto più pulita del pasticciare con le direzioni di flusso nidificate
Ross,

5

Questo funziona perfettamente per me. Metti il ​​pulsante prima da quando inizi a destra. Se FlowDirection diventa un problema, aggiungi semplicemente StackPanel e specifica FlowDirection = "LeftToRight" per quella porzione. O semplicemente specificare FlowDirection = "LeftToRight" per il controllo pertinente.

<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" FlowDirection="RightToLeft">
    <Button Width="40" HorizontalAlignment="Right" Margin="3">Right</Button>
    <TextBlock Margin="5">Left</TextBlock>
    <StackPanel FlowDirection="LeftToRight">
        <my:DatePicker Height="24" Name="DatePicker1" Width="113" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" />    
    </StackPanel>
    <my:DatePicker FlowDirection="LeftToRight" Height="24" Name="DatePicker1" Width="113" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" />    
</StackPanel>

4
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Left"  />
    <Button Width="30" Grid.Column="1" >Right</Button>
</Grid>

0

per Windows 10 usa relativePanel invece del pannello stack e usa

relativepanel.alignrightwithpanel = "true"

per gli elementi contenuti.


0

Se stai riscontrando un problema come quello in cui le etichette erano centrate nel mio pannello di stack verticale, assicurati di utilizzare i controlli a larghezza intera. Elimina la proprietà Larghezza o inserisci il pulsante in un contenitore a larghezza intera che consente l'allineamento interno. WPF si basa sull'utilizzo di contenitori per controllare il layout.

<StackPanel Orientation="Vertical">
    <TextBlock>Left</TextBlock>
    <DockPanel>
        <Button HorizontalAlignment="Right">Right</Button>
    </DockPanel>
</StackPanel>

StackPanel verticale con etichetta sinistra seguito dal pulsante destro

Spero che aiuti.


-8

Forse non è quello che vuoi se hai bisogno di evitare valori di dimensione codificanti, ma a volte uso uno "shim" (Separatore) per questo:

<Separator Width="42"></Separator>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.