スタックパネルでアイテムを揃えますか?


148

水平方向のStackPanelに2つのコントロールを配置して、適切なアイテムをStackPanelの右側にドッキングできるかどうかを考えていました。

私は以下を試しましたが、うまくいきませんでした:

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

上のスニペットでは、ButtonをStackPanelの右側にドッキングします。

注:グリッドなどではなく、StackPanelで実行する必要があります。


あなたはグリッドを明示的に言及していませんが、それがまさに私がこれを達成した方法です。私の質問に、自分のニーズに合ったグリッド以外の回答があるかどうかを確認します。
JMD 2010年

ええ、私は誰かがこのようにしてスタックパネルでいっぱいのプロジェクトを私にちょうど与えました、それは彼がそれを修正したい方法です。
Shimmy Weitzhandler、2010年

3
私はこれが(非常に)遅いことを知っていますが、スタックパネル内にドックパネルを配置できませんでしたか?
Kian、2012

1
@キアン、あなたはあなたのコメントに完全に正解です、私はそれを自分で考え、試しました、そしてそれは完全に機能しました。
Gabrielius 14

回答:


221

これは次のようにして実現できますDockPanel

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

違いは、a StackPanelは子要素を単一の行(垂直または水平)に配置するのに対し、a DockPanelは子要素を互いに相対的に水平または垂直に配置できる領域を定義します(このDockプロパティは他の要素に対する要素の位置を変更します)同じコンテナ内の要素。などの配置プロパティは、HorizontalAlignment親要素に対する要素の位置を変更します)。

更新

コメントで指摘されているように、のFlowDirectionプロパティを使用することもできますStackPanel。@D_Besterの回答を参照してください。


1
これは私が「等」で意味したことです 私は答えはノーだと思います、そしてそれを難し​​い方法でやらなければならないでしょう、上のJMDに対する私のコメントを読んでください
Shimmy Weitzhandler

まあ、StackPanelは単純にあなたが望むレイアウトを行うことができません。グリッドは最も柔軟性がありますが、StackPanelからDockPanelへの変更はそれほど難しくありません。
Dirk Vollmar、2010年

2
Windows 8にはDockPanelはありませんか?
クリストフ

@DirkVollmar実際、StackPanelは非常にうまく機能します。私の回答を参照してください。
D_Bester

1
アイテムを最も右揃えにしたい場合LastChildFill="False"<DockPanel LastChildFill="False">、つまり、を参照してください。stackoverflow.com/ a / 9599290/4573839
yu yang Jian

68

ヨは、設定することができますFlowDirectionStack panelRightToLeftし、すべての項目が右側に整列されます。


3
ただし、これにより、StackPanelのコントロールの順序が変更(反転)することに注意してください。
rumblefx0 2014年

1
@slattery FlowDirectionに問題がある場合は、別のStackPanelに入力してFlowDirectionを指定します。私の答えを見てください。
D_Bester 2017年

1
@ rumblefx0:コントロールが右または下にドッキングされている場合、DockPanelはコントロールの順序も逆にします。これは、最初のコントロールが最初にドッキングされるためです。
Olivier Jacot-Descombes

29

この質問つまずく人のために、ここでこのレイアウトを実現する方法だGrid

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

作成する

Server:                                                                   http://127.0.0.1

18

DockPanelを使用してこれを希望どおりに機能させることができず、StackPanelのフロー方向を逆にするのは面倒です。グリッドの使用はオプションではありません。実行時にグリッド内のアイテムが非表示になる可能性があるため、設計時に列の総数がわかりません。私が思いつくことができる最も簡単なソリューションは次のとおりです。

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

これにより、デザインと実行時の両方で、コントロールの数に関係なく、StackPanel内のコントロールが使用可能なスペースの右側に配置されます。わーい!:)


FlowDirectionに問題がある場合は、別のStackPanelに入力してFlowDirectionを指定します。私の答えを見てください。
D_Bester 2017年

これは、ネストされた流れ方向をいじるよりもはるかにクリーンなソリューションだと思います
Ross

5

これは私にとって完璧に機能します。右側から始めているので、ボタンを最初に置いてください。FlowDirectionが問題になる場合は、その周りにStackPanelを追加し、その部分にFlowDirection = "LeftToRight"を指定します。または、関連するコントロールにFlowDirection = "LeftToRight"を指定するだけです。

<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の場合、スタックパネルの代わりにrelativePanelを使用し、

relativepanel.alignrightwithpanel = "true"

含まれる要素。


0

垂直スタックパネルでラベルが中央に配置されていたような問題が発生した場合は、全幅のコントロールを使用してください。Widthプロパティを削除するか、ボタンを全幅コンテナに配置して、内部配置を許可します。WPFはすべて、コンテナーを使用してレイアウトを制御することを目的としています。

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

左のラベルとそれに続く右のボタンがある垂直方向のStackPanel

これがお役に立てば幸いです。


-8

サイズ値のハードコーディングを回避する必要がある場合は、おそらくあなたが望むものではないかもしれませんが、私はこれに「シム」(セパレータ)を使用することがあります:

<Separator Width="42"></Separator>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.