Yığın panelindeki öğeler hizalansın mı?


148

Ben doğru öğenin StackPanel sağ tarafına sabitlenmiş olması için yatay odaklı bir StackPanel içinde 2 kontrol olup olmadığını merak ediyordum.

Aşağıdakileri denedim ama işe yaramadı:

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

Yukarıdaki snippet'te Düğmenin StackPanel'in sağ tarafına sabitlenmesini istiyorum.

Not: Ben Grid vb değil StackPanel ile yapılması gerekir.


Hiçbir ızgaradan açıkça bahsediyorsunuz, ama tam da bunu başardım. Sorunuz için kendi ihtiyaçlarıma uyan başka birisinin şebeke dışı bir cevabı olup olmadığını görmek isterim.
JMD

evet, birisi bana bu şekilde yığın panellerle dolu bir proje verdim, bu şekilde düzeltilmesini istiyor.
Shimmy Weitzhandler

3
Bunun (son derece) geç olduğunu biliyorum, ama yığın panelinin içine bir rıhtım koyamaz mısın?
Kian

1
@Kian, yorumunda kesinlikle haklısın, bunu kendim düşündüm, denedim ve mükemmel çalıştı.
Gabrielius

Yanıtlar:


221

Bunu aşağıdakilerle yapabilirsiniz DockPanel:

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

Aradaki fark, a StackPanelöğesinin alt öğeleri tek bir satıra (dikey veya yatay olarak) DockPaneldüzenlerken, bir alt öğeyi birbirine göre yatay veya dikey olarak düzenleyebileceğiniz bir alanı tanımlar ( Docközellik, öğenin konumunu diğerine göre değiştirir HorizontalAlignmentBir öğenin üst öğeye göre konumunu değiştirme gibi hizalama özellikleri ).

Güncelleme

Yorumlarda da belirtildiği FlowDirectiongibi a StackPanel. @ D_Bester'ın cevabına bakınız .


1
'vb.' ile kastettiğim budur. Sanırım cevap hayır, ve zor bir şekilde yapmak zorunda kalacak, yukarıdaki JMD için
yorumumu

StackPanel istediğiniz düzeni yapamaz. Bir Izgara size en fazla esnekliği verecektir, ancak StackPanel'den DockPanel'e geçiş çok zor görünmemektedir.
Dirk Vollmar

2
Windows 8'de DockPanel yok, başka çözümler var mı?
Christoph

@DirkVollmar Aslında StackPanel gayet iyi çalışıyor, cevabımı görün.
D_Bester

1
Eğer doğru en seti öğesi hizalama izin vermek istiyorsanız LastChildFill="False"olduğunu <DockPanel LastChildFill="False">görmek stackoverflow.com/a/9599290/4573839
yu yang Jian

68

Yo ayarlayabilirsiniz FlowDirectionait Stack paneletmek RightToLeftve daha sonra tüm öğeleri sağ tarafına hizalanır.


3
Ancak bunun StackPanel'deki denetimlerin sırasını değiştirdiğini (tersine çevirdiğini) unutmayın.
rumblefx0

1
@slattery FlowDirection bir sorunsa başka bir StackPanel koyun ve FlowDirection'ı belirtin. Cevabımı gör.
D_Bester

1
@ rumblefx0: not, DockPanel ayrıca sağa veya alta yerleştirilmişlerse kontrollerin sırasını tersine çevirir. Bunun nedeni, ilk kontrolün ilk önce yerleştirilmiş olmasıdır.
Olivier Jacot-Descombes

29

Bu soruya denk olanlar için, burada bu düzeni sağlamak için nasıl birlikte bir Grid:

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

yaratır

Server:                                                                   http://127.0.0.1

18

Bir DockPanel kullanarak istediğim gibi bu çalışma alınamadı ve bir StackPanel akış yönünü tersine zahmetli. İçindeki öğeler çalışma zamanında gizlenmiş olabileceğinden, bir ızgara kullanmak bir seçenek değildir ve bu nedenle tasarım zamanında toplam sütun sayısını bilmiyorum. Gelebileceğim en iyi ve en basit çözüm:

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

Bu, StackPanel içindeki kontrollerin, hem tasarımda hem de çalışma zamanında kontrol sayısından bağımsız olarak kullanılabilir alanın sağ tarafına hizalanmasına neden olacaktır. Yaşasın! :)


FlowDirection bir sorunsa, başka bir StackPanel koyun ve FlowDirection'ı belirtin. Cevabımı gör.
D_Bester

Bunun iç içe akış yönleriyle uğraşmaktan çok daha temiz bir çözüm olduğunu düşünüyorum
Ross

5

Bu benim için mükemmel çalışıyor. Sağdan başladığınız için önce düğmeyi koymanız yeterli. FlowDirection bir sorun haline gelirse, etrafına bir StackPanel ekleyin ve o bölüm için FlowDirection = "LeftToRight" değerini belirtin. Veya ilgili denetim için yalnızca FlowDirection = "LeftToRight" öğesini belirtin.

<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

Windows 10 için yığın paneli yerine relativePanel kullanın ve

relativepanel.alignrightwithpanel = "true"

içerdiği öğeler için.


0

Dikey yığın panelimde etiketlerin ortalandığı yerde bir sorun yaşıyorsanız, tam genişlik denetimlerini kullandığınızdan emin olun. Width özelliğini silin veya düğmenizi dahili hizalamaya izin veren tam genişlikte bir kaba koyun. WPF, düzeni kontrol etmek için kapları kullanmakla ilgilidir.

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

Sol Etiket ve ardından Sağ Düğme ile Dikey StackPanel

Umarım bu yardımcı olur.


-8

Sabit kodlama boyutu değerlerinden kaçınmanız gerekiyorsa belki istediğiniz şey değil, ancak bazen bunun için bir "shim" (Ayırıcı) kullanıyorum:

<Separator Width="42"></Separator>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.