2011-07-28 31 views
7

Tôi có phong cách sau đây theo quy định tại App.xaml tôiNgăn chặn một TextBox từ việc mở rộng theo chiều ngang trong WPF

<Style x:Key="textBoxMultiline" TargetType="{x:Type TextBox}" > 
    <Setter Property="VerticalScrollBarVisibility" Value="Auto" /> 
    <Setter Property="HorizontalScrollBarVisibility" Value="Hidden" /> 
    <Setter Property="MinHeight" Value="50" /> 
    <Setter Property="TextWrapping" Value="Wrap" /> 
</Style> 

Và trong suốt giải pháp chúng tôi đang sử dụng nó trên mỗi hộp văn bản cần có một văn bản ngắn gọn.

<TextBox x:Name="textBoxDescription" Grid.Row="2" Grid.Column="1" Style="{DynamicResource textBoxMultiline}" /> 

Tất cả mọi thứ hoạt động tốt, nhưng sau đó các khách hàng phàn nàn về một số lĩnh vực được corped trên màn hình lớn hơn với độ phân giải thấp hơn, vì vậy tôi đặt một ScrollViewer vào một trong các nút cây thị giác cao để ngăn chặn sự corping.

<ScrollViewer Height="Auto" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
    ... 
</ScrollViewer> 

Kỳ lạ, kiểu TextBox es với kiểu trên bắt đầu mở rộng sang bên phải thay vì gói văn bản.

Có cách nào để ngăn chặn điều này mà không xóa ScrollViewer không?

Trả lời

4

Bạn phải xác định MaxWidth cho số TextBox, nếu không không có giới hạn vì ScrollViewer.

+0

Tôi đang sử dụng phong cách với textbox của độ rộng khác nhau. Tôi đã kinda tìm kiếm một giải pháp chung chung hơn như ghi đè các mẫu hộp văn bản để bao gồm một cái gì đó có chiều rộng cố định và sau đó ràng buộc các textbox actualwidth đến chiều rộng phần tử mới đó. Điều này có vẻ rất nhiều công khai, nhưng tôi đã tìm kiếm một cái gì đó mà chỉ tiến hóa thay đổi phong cách TextBox. – dcarneiro

+0

Điều bạn đang làm có phần mâu thuẫn. Bạn sẽ có hộp văn bản giới hạn chiều rộng, sau đó bạn sẽ đặt nó trong một scrollviewer có một không gian ngang không bị chặn ("Auto"). Bạn có thể giải quyết nó, nhưng không có cách nào nói chung. Bạn nên tạo một ràng buộc từ ActualWidth của scrollviewer và chiều rộng (Max) của hộp văn bản. Vấn đề là bạn phải thêm một bộ chuyển đổi, để đưa vào tài khoản các offsets và các chất liệu khác (rất khó chịu như đối với tôi). –

+0

Thanh cuộn ngang là một hack vì các điều khiển khác bị cắt trên màn hình độ phân giải thấp. Tôi đã cố gắng để ràng buộc chiều rộng hộp văn bản đến một phần tử có cùng độ rộng (một hộp văn bản khác trên cùng một ô lưới có cùng kiểu nhưng ẩn) và nó hoạt động. Nhưng sau đó tôi thấy rằng TextBlock nơi thông tin cũng sẽ mở rộng theo chiều ngang thay vì gói văn bản. Điều này cho tôi biết rằng thanh cuộn ngang được ưu tiên hơn thuộc tính TextWrapping. Vì vậy, tôi đoán tôi phải thiết kế lại giao diện người dùng để hỗ trợ độ phân giải màn hình thấp. – dcarneiro

7

Nếu bạn không muốn cứng mã chiều rộng thì bạn có thể đi cho ràng buộc chiều rộng của mặt hàng đó mẹ yếu tố ... đây là một mẫu

Ở đây tôi đang ràng buộc textbox maxwidth với scrolviewer chiều rộng thực tế. Và bạn cũng phải đảm bảo rằng chiều rộng columndefinition phải được đặt thành "*" không phải là "Tự động". nếu bạn đặt nó để tự động nó sẽ bỏ qua chiều rộng ScrollViewer và tiếp tục mở rộng độ rộng của ScrollViewer và textbox .. tôi nghĩ rằng bạn rơi vào trường hợp này ....

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"></ColumnDefinition> 
      <ColumnDefinition Width="*"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <ScrollViewer HorizontalScrollBarVisibility="Auto" Name="scv"> 
      <TextBox Height="30" TextWrapping="Wrap" MaxWidth="{Binding ElementName=scv,Path=ActualWidth}"></TextBox> 
     </ScrollViewer> 
    </Grid> 
+1

Đáng buồn là có một số VisualTreeItems giữa ScrollViewer và TextBox (es) và họ thậm chí không trên cùng một UserControl. Mặc dù vậy vẫn có tỷ suất lợi nhuận/chênh lệch. AFAIK thách thức thực sự là để ưu tiên TextWrapping qua việc thay đổi kích thước ngang của một UserControl tổ tiên. – dcarneiro

4

Các giải pháp được cung cấp từ @bathineni đã giúp tôi giải quyết vấn đề của mình. Dưới đây là những gì phù hợp với tôi:

<Grid > 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="50"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
     <Button Grid.Column="0" Width="30" Height="23" Margin="10,5" Content="..."/> 
     <ScrollViewer Grid.Column="1" HorizontalScrollBarVisibility="Disabled" verticalScrollBarVisibility="Disabled" Name="scv"> 
      <TextBox Height="25" Text="Insert here long text" MaxWidth="{Binding ElementName=scv, Path=ActualWidth}" HorizontalAlignment="Stretch" /> 
     </ScrollViewer> 
    </Grid> 
0

Làm việc cho tôi. Nếu bạn muốn thanh cuộn xuất hiện trong hộp văn bản, bạn có thể thêm

HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" 

cho TextBox

Các vấn đề liên quan