2010-09-09 5 views
26

Trong cửa sổ tôi có một danh sách các số DockPanel để chỉ định một vài tệp. Mỗi DockPanel có một TextBox (cho đường dẫn) và một nút (để duyệt tìm một tập tin).WPF Dockpanel con đầu tiên sử dụng không gian còn lại

tôi đã tái tạo một trang WPF đơn giản để demostrate vấn đề ở đây:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="150" 
    Height="22"> 
    <DockPanel> 
     <TextBox HorizontalAlignment="Stretch"/> <!-- path to file --> 
     <Button Content="..." DockPanel.Dock="Right"/> <!-- button to browse for file --> 
    </DockPanel> 
</Page> 

Vấn đề là tôi muốn nút ở bên phải của hộp văn bản, nhưng điều đó làm cho textbox để được thực sự nhỏ từ LastChild của DockPanel là nút nó sử dụng hết dung lượng còn lại. Ive đã cố gắng thay đổi điều này bằng cách xáo trộn chúng xung quanh và thiết lập LastChildFill="False" nhưng điều đó chỉ làm cho nút nhỏ lại, không làm cho TextBox rộng (ngay cả với HorizontalAlignment="Stretch").

Lý do tôi muốn điều khiển theo thứ tự đó là tôi muốn người dùng truy cập Hộp văn bản trước nút khi sử dụng tab để điều hướng trong cửa sổ. Tôi nhìn vào thiết lập TabIndex nhưng nó cảm thấy hacky, tính năng yêu thích của WPF là tabindex là theo thứ tự các conrols được định nghĩa trong XAML. Chưa kể rằng tôi có thể sẽ phải tự đặt TabIndex trên mọi thứ trong Cửa sổ.

Với tôi, có vẻ như thiết lập của TextBox.HorizontalAlignment không được tôn trọng. Làm cách nào để kiểm soát đầu tiên có thể sử dụng nhiều không gian nhất có thể nhưng vẫn giữ nguyên thứ tự tab?

Trả lời

23

Nếu bạn không muốn hành vi của DockPanel, không sử dụng DockPanel.

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 

    <TextBox /> 
    <Button Content="..." Grid.Column="1"/> 
</Grid> 
+4

+1 bởi vì nó không có vấn đề TabOrder. Nếu ai đó muốn tránh việc gõ ColumnDefinitions trong các kịch bản đơn giản như vậy, hãy xem giải pháp này: http://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/ – surfen

34

Làm cho nó như thế này:

<DockPanel LastChildFill="True"> 
    <Button Content="..." DockPanel.Dock="Right"/> <!-- button to browse for file --> 
    <TextBox DockPanel.Dock="Left" HorizontalAlignment="Stretch"/> <!-- path to file --> 
</DockPanel> 
+4

Brilliant! Hoàn toàn không trực quan và đáng ghét, nhưng làm việc như một sự quyến rũ và làm cho một loại kỳ lạ của cảm giác cho DockPanel được thiết kế như thế nào. Cuộc gọi tốt. – TonganJedi

+8

Tôi đã nhìn thấy điều này trong nhiều dịp. Mối quan tâm chính của tôi là thứ tự của các phần tử trong XAML không còn khớp với bố cục trực quan của cửa sổ nữa. Và nó làm rối trật tự tab. –

+0

Tôi đồng ý với @ChristofferLette +1, nhưng chỉ trong trường hợp ai đó cần nó, đây là giải pháp cho vấn đề đặt hàng tab. Nó có thể được khá nhiều công việc thủ công và không phải lúc nào cũng hoạt động tốt (ví dụ với DataGrid): http://stackoverflow.com/a/4808810/724944 – surfen