2010-03-13 39 views
7

Tôi có một mã XAML:Làm thế nào để có một điều khiển điền tất cả các không gian có sẵn

<Grid> 
    <WrapPanel> 
    <TextBox ></TextBox> 
    <Button Content="GetIt" /> 
    </WrapPanel> 
</Grid> 

Làm thế nào tôi có thể nhận được tất cả không gian có sẵn cho TextBox?

tôi muốn làm một cái gì đó như thế:

| [____________________] [GetIt] |

+2

Mục đích của WrapPanel là gì? –

+0

Tôi chỉ không biết cách tốt nhất để làm điều đó: P – Neir0

Trả lời

7

Có một số cách này có thể đạt được, trong đó có cái này:

<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="*" /> 
    <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <TextBox /> 
    <Button Grid.Column="1">GetIt</Button> 
</Grid> 
+0

Cảm ơn! Tôi có thể hỏi một câu hỏi khác không? Làm thế nào tôi có thể dán cột lưới. | [__________] [GetIt] | | ................... | | ... đây là một tên khác. | | .mục tiêu văn bản. | | ................... | – Neir0

+0

Ohh xin lỗi. Nhận xét của tôi bị mất định dạng. Tôi có nghĩa là http://img708.imageshack.us/img708/2383/screengw.png – Neir0

+0

Neir0 - Bạn đang cố gắng để có được hiệu ứng chính xác DockPanel được thiết kế cho. Bạn có thể làm điều tương tự với Grid, linh hoạt hơn nhiều, nhưng phải mất nhiều XAML hơn và đòi hỏi rất nhiều bảo trì các giá trị Row/Column/RowSpan/ColumnSpan nếu bạn cần thêm hoặc xóa các mục. –

3

Hãy thử điều này:

<Grid> 
    <TextBox HorizontalAlignment="Stretch" Margin="2,2,102,2"></TextBox> 
    <Button HorizontalAlignment="Right" Width="100" Content="GetIt" /> 
</Grid> 

Chỉ cần chắc nút chiều rộng mong muốn và hộp văn bản sẽ điền phần còn lại.


Cảm ơn bạn đã nắm bắt; sửa chữa ở trên để xử lý đúng lề trên bên phải. Tuy nhiên, điều này yêu cầu bạn cập nhật lề khi chiều rộng nút thay đổi. Hai cột là giải pháp tốt hơn nếu bạn định thay đổi khoảng cách thường xuyên. Sử dụng lề là sạch hơn nếu bạn có nhiều điều khiển trong lưới và không muốn tạo lưới lồng nhau để xử lý loại phân chia này.

+0

Nhưng trong trường hợp này nút trên hộp văn bản. Ở đây bạn có thể xem ảnh chụp màn hình http://img214.imageshack.us/img214/918/screeneb.png – Neir0

+0

Đó là một kỹ thuật mà tôi đặt cược ra khỏi việc học cách bố trí trong CSS mà không cần bảng. –

+0

Nó cũng là loại mã mà Blend sẽ 'đoán' nếu bạn đang giảm và thay đổi kích thước các điều khiển trong một lưới. –

2

Cách đơn giản nhất là sử dụng một DockPanel thay vì một Lưới (mặc định cho LastChildFill là đúng nhưng tôi cũng nói thêm nó ở đây cho rõ ràng):

<DockPanel LastChildFill="True"> 
    <Button Content="GetIt" DockPanel.Dock="Right" /> 
    <TextBox ></TextBox> 
</DockPanel> 
2

Đây là một cách để đạt được bố cục mà bạn' đang tìm kiếm:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
    <Style TargetType="TextBox"> 
     <Setter Property="Margin" Value="2"/> 
    </Style> 
    </Page.Resources> 
    <DockPanel> 
    <DockPanel DockPanel.Dock="Top"> 
     <!-- Because the Button is fixed in size, you can divide the row it's 
     in using a DockPanel: the Button is docked to the right edge, and the 
     TextBox fills up the remaining available space. --> 
     <Button Margin="2" Padding="2" DockPanel.Dock="Right">GetIt</Button> 
     <TextBox /> 
    </DockPanel> 
    <!-- Because the TextBoxes *aren't* fixed in size, you can't use docking, 
    as it won't size them. So put them in a Grid and use star sizing to 
    divide the grid's vertical space into two equal parts. The Grid will 
    fill up the remainder of the (outer) DockPanel. --> 
    <Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <TextBox Grid.Row="0">Another TextBox</TextBox> 
     <TextBox Grid.Row="1">Yet another TextBox</TextBox> 
    </Grid> 
    </DockPanel> 
</Page> 
Các vấn đề liên quan