Sắp xếp các mục trong bảng ngăn xếp?


148

Tôi đã tự hỏi nếu tôi có thể có 2 điều khiển trong StackPanel định hướng theo chiều ngang để mục bên phải được neo vào bên phải của StackPanel.

Tôi đã thử cách sau nhưng không được:

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

Trong đoạn trích trên, tôi muốn Nút được gắn vào bên phải của StackPanel.

Lưu ý: Tôi cần nó được thực hiện với StackPanel, không phải Grid, v.v.


Bạn đề cập rõ ràng không có lưới, nhưng đó chính xác là cách tôi hoàn thành việc này. Tôi sẽ quan tâm xem liệu người khác có câu trả lời không liên quan đến câu hỏi của bạn phù hợp với nhu cầu của riêng tôi không.
JMD

vâng, tôi có người vừa đưa cho tôi một dự án đầy các bảng ngăn xếp theo cách này, đó là cách anh ta muốn sửa nó.
Shimmy Weitzhandler

3
Tôi biết điều này là (cực kỳ) muộn, nhưng bạn có thể không đặt một dockpanel trong stackpanel không?
Kian

1
@Kian, bạn hoàn toàn đúng với nhận xét của bạn, tôi đã nghĩ về nó, đã thử và nó hoạt động hoàn hảo.
Gabrielius

Câu trả lời:


221

Bạn có thể đạt được điều này với một DockPanel:

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

Sự khác biệt là a StackPanelsẽ sắp xếp các phần tử con thành một dòng đơn (theo chiều dọc hoặc chiều ngang) trong khi đó DockPanelxác định một khu vực nơi bạn có thể sắp xếp các phần tử con theo chiều ngang hoặc chiều dọc, tương đối với nhau (thuộc Docktính thay đổi vị trí của phần tử so với phần tử khác các phần tử trong cùng một vùng chứa. Các thuộc tính sắp xếp, chẳng hạn như HorizontalAlignment, thay đổi vị trí của một phần tử so với phần tử cha của nó).

Cập nhật

Như đã chỉ ra trong các ý kiến, bạn cũng có thể sử dụng FlowDirectiontài sản của a StackPanel. Xem câu trả lời của @ D_Bester .


1
đây là những gì tôi muốn nói với 'v.v.' Tôi đoán câu trả lời là không, và sẽ phải thực hiện nó một cách khó khăn, đọc bình luận của tôi cho JMD ở trên
Shimmy Weitzhandler

Chà, StackPanel đơn giản là không thể làm bố cục mà bạn muốn. Lưới sẽ cung cấp cho bạn sự linh hoạt nhất, nhưng việc thay đổi từ StackPanel sang DockPanel dường như không quá khó khăn.
Dirk Vollmar

2
Không có DockPanel trong Windows 8, còn giải pháp nào khác không?
Christoph

@DirkVollmar Thật ra StackPanel hoạt động khá tốt, xem câu trả lời của tôi.
D_Bester

1
nếu bạn muốn để mục thẳng hàng nhất, hãy đặt LastChildFill="False"đó <DockPanel LastChildFill="False">, xem stackoverflow.com/a/9599290/4573839
yu yang Jian

68

Yo có thể thiết lập FlowDirectioncủa Stack panelđể RightToLeft, và sau đó tất cả các mục sẽ được sắp xếp ngay phía bên phải.


3
Tuy nhiên, lưu ý rằng điều này thay đổi (đảo ngược) thứ tự của các điều khiển trong StackPanel.
rumblefx0

1
@slattery Nếu FlowDirection là một vấn đề, chỉ cần đặt vào StackPanel khác và chỉ định FlowDirection. Xem câu trả lời của tôi.
D_Bester

1
@ rumblefx0: lưu ý, DockPanel cũng đảo ngược thứ tự của các điều khiển, nếu chúng được neo ở bên phải hoặc phía dưới. Điều này là do điều khiển đầu tiên, được cập cảng đầu tiên.
Olivier Jacot-Descombes

29

Đối với những người vấp ngã khi câu hỏi này, dưới đây là cách để đạt được bố trí này với một Grid:

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

tạo ra

Server:                                                                   http://127.0.0.1

18

Không thể làm việc này bằng DockPanel theo cách tôi muốn và đảo ngược hướng dòng chảy của StackPanel là rắc rối. Sử dụng lưới không phải là một tùy chọn vì các mục bên trong nó có thể bị ẩn trong thời gian chạy và do đó tôi không biết tổng số cột tại thời điểm thiết kế. Giải pháp tốt nhất và đơn giản nhất tôi có thể đưa ra là:

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

Điều này sẽ dẫn đến các điều khiển bên trong StackPanel được căn chỉnh ở phía bên phải của không gian có sẵn bất kể số lượng điều khiển - cả về thiết kế và thời gian chạy. Yay! :)


Nếu FlowDirection là một vấn đề, chỉ cần đặt vào StackPanel khác và chỉ định FlowDirection. Xem câu trả lời của tôi.
D_Bester

Tôi nghĩ rằng đây là một giải pháp sạch hơn nhiều so với việc lộn xộn với các hướng dòng chảy lồng nhau
Ross

5

Điều này làm việc hoàn hảo cho tôi. Chỉ cần đặt nút đầu tiên vì bạn bắt đầu ở bên phải. Nếu FlowDirection trở thành vấn đề, chỉ cần thêm StackPanel xung quanh nó và chỉ định FlowDirection = "LeftToRight" cho phần đó. Hoặc chỉ cần chỉ định FlowDirection = "LeftToRight" cho điều khiển có liên quan.

<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

đối với windows 10, hãy sử dụng RelPanel thay vì bảng ngăn xếp và sử dụng

Tương đối.alignrightwithpanel = "đúng"

cho các yếu tố chứa.


0

Nếu bạn gặp vấn đề như vấn đề tôi gặp phải khi các nhãn được đặt ở giữa trong bảng xếp chồng dọc của tôi, hãy đảm bảo bạn sử dụng các điều khiển chiều rộng đầy đủ. Xóa thuộc tính Width hoặc đặt nút của bạn trong một thùng chứa toàn chiều rộng cho phép căn chỉnh bên trong. WPF là tất cả về việc sử dụng các container để kiểm soát bố cục.

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

StackPanel dọc với nhãn trái theo sau là nút phải

Tôi hi vọng cái này giúp được.


-8

Có thể không phải là những gì bạn muốn nếu bạn cần tránh các giá trị kích thước mã hóa cứng, nhưng đôi khi tôi sử dụng "shim" (Dấu phân cách) cho việc này:

<Separator Width="42"></Separator>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.