2008-11-11 36 views
81

Điều này có vẻ như nó phải được dễ dàng nhưng tôi stumped. Trong WPF, tôi muốn một TextBox trải dài tới chiều rộng của nó, nhưng chỉ với chiều rộng tối đa. Vấn đề là tôi muốn nó được căn trái trong phụ huynh của nó. Để làm cho nó căng ra, bạn phải sử dụng HorizontalAlignment = "Stretch", nhưng sau đó kết quả là trung tâm. Tôi đã thử nghiệm với HorizontalContentAlignment, nhưng nó dường như không làm gì cả.HorizontalAlignment = Stretch, MaxWidth và Căn trái cùng một lúc?

Làm cách nào để nhận được hộp văn bản màu xanh này phát triển với kích thước của cửa sổ, có chiều rộng tối đa là 200 pixel và được căn trái?

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
    <TextBox Background="Azure" Text="Hello" HorizontalAlignment="Stretch" MaxWidth="200" /> 
    </StackPanel> 
</Page> 

Bí quyết là gì?

+0

Vui lòng xem [ "nên câu hỏi bao gồm‘thẻ’trong tiêu đề của họ?"] (http://meta.stackexchange.com/questions/19190/should- questi các thẻ kèm theo, trong đó sự đồng thuận là "không, chúng không nên"! * yeah, tôi biết ... chỉ vì lý do di sản:) * –

Trả lời

81

Bạn có thể đặt HorizontalAlignment để Left, thiết MaxWidth bạn và sau đó ràng buộc Width đến ActualWidth của phần tử cha mẹ:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Name="Container"> 
    <TextBox Background="Azure" 
    Width="{Binding ElementName=Container,Path=ActualWidth}" 
    Text="Hello" HorizontalAlignment="Left" MaxWidth="200" /> 
    </StackPanel> 
</Page> 
+7

Không tự động hóa .. Dường như phù hợp với nội dung .. Tôi có thiếu gì đó không? – Gishu

+0

Điều này dường như làm hỏng trình phát bạc của tôi – resopollution

+2

@Gishu, hãy đảm bảo bạn đặt 'HorizontalAlignment =" Stretch "' trên phần tử 'Container'. (p.s., tôi nhận ra bạn đã hỏi câu hỏi đó hơn 6 năm trước.) –

41
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" MaxWidth="200"/> 
    </Grid.ColumnDefinitions> 

    <TextBox Background="Azure" Text="Hello" /> 
</Grid> 
+0

Tôi nghĩ bạn cần đặt VerticalAlignment = "Top" cho hộp văn bản .. dường như được kéo theo mặc định. – Gishu

+1

+1. Đẹp và sạch sẽ. Bất cứ lúc nào tôi cố gắng để quản lý bố trí bằng cách ràng buộc với một số chiều rộng thực tế (như trong câu trả lời được chấp nhận), mọi thứ trở nên lộn xộn. –

+1

Tôi vừa xem qua câu hỏi này trong khi cố gắng giải quyết cùng một vấn đề. Trong trường hợp của tôi, đây là câu trả lời hay nhất khi nó hoạt động trong WinRT. Câu trả lời khác không phải vì bạn không thể liên kết trên ActualWidth trong WinRT. – Slade

8

Cả hai câu trả lời cho từng làm việc cho các vấn đề tôi đã nói - Cảm ơn!

Trong ứng dụng thực sự của tôi, tôi đã cố gắng để hạn chế một bảng điều khiển bên trong của một ScrollViewer và phương pháp của Kent đã không xử lý rất tốt vì một lý do tôi không bận tâm để theo dõi. Về cơ bản các điều khiển có thể mở rộng ra ngoài thiết lập MaxWidth và đánh bại ý định của tôi.

Kỹ thuật của Nir hoạt động tốt và không gặp sự cố với ScrollViewer, mặc dù có một điều nhỏ nhặt cần chú ý. Bạn muốn chắc chắn rằng lề phải và trái trên TextBox được đặt thành 0 hoặc chúng sẽ bị cản trở. Tôi cũng đã thay đổi ràng buộc để sử dụng ViewportWidth thay vì ActualWidth để tránh các vấn đề khi thanh cuộn dọc xuất hiện.

6

Bạn có thể sử dụng cho các Chiều rộng của DataTemplate của bạn:

Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}" 

Hãy chắc chắn rằng gốc DataTemplate của bạn có Margin = "0" (bạn có thể sử dụng một số bảng điều khiển là gốc và thiết lập Margin để con cái mà root)

0

tôi sẽ sử dụng SharedGroupSize

<Grid> 
    <Grid.ColumnDefinition> 
     <ColumnDefinition SharedGroupSize="col1"></ColumnDefinition> 
     <ColumnDefinition SharedGroupSize="col2"></ColumnDefinition> 
    </Grid.ColumnDefinition> 
    <TextBox Background="Azure" Text="Hello" Grid.Column="1" MaxWidth="200" /> 
</Grid> 
Các vấn đề liên quan