2009-03-03 37 views
12

Tôi có một TextBox được định nghĩa bên trong một cửa sổ như sau:phép TextBox được thay đổi kích cỡ nhưng không phát triển trên người dùng nhập vào

<Window x:Class="NS.MainWindow" 
    ... 
    SizeToContent="WidthAndHeight"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="100" /> 
      <ColumnDefinition MinWidth="200" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition MinHeight="50" /> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock> 

     <TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" /> 
    </Grid> 
</Window> 

Vấn đề là khi người dùng nhập vào TextBox nó mở rộng ở bên phải kể từ chỉ có MinWidth được đặt. Những gì tôi thực sự muốn là văn bản để bọc cho dòng tiếp theo. Tôi có thể làm cho nó để làm điều này nếu tôi thay đổi MinWidth trên cột để được chiều rộng thay thế. Tuy nhiên nếu tôi làm điều này, sau đó TextBox không còn thay đổi kích thước khi cửa sổ được thay đổi kích cỡ.

Có cách nào tôi có thể có cả hai? (ví dụ: chỉ thay đổi kích thước khi đổi kích thước cửa sổ, nếu không thì hãy quấn)

Trả lời

15

Lý do bạn gặp phải hành vi này là vì bạn đã đặt thuộc tính SizeToContent của của cửa sổ - về cơ bản, cho phép Window tự thay đổi kích thước dựa trên kích thước được yêu cầu bởi nội dung của nó. Vì vậy, khi bạn nhập nhiều nội dung hơn, hộp văn bản cho biết tôi cần thêm không gian, cửa sổ ngoan ngoãn phát triển. Hộp văn bản của bạn sẽ không phát triển nếu bạn không đặt thuộc tính SizeToContent.

Vì vậy, tôi muốn nói mất thiết lập thuộc tính SizeToContent & Sử dụng định cỡ lưới tỷ lệ. Ở đây tôi nói làm cho cột # 2 gấp đôi chiều rộng của cột # 1. Giá trị "Stretch" mặc định của HorizontalAlignment và VerticalAlignment cho Grid nên đảm bảo rằng các điều khiển của bạn thay đổi kích thước chính xác trên một cửa sổ thay đổi kích thước.

<Window ... 
    Title="MyWindow" WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip" 
     MinWidth="300" Width="300" Height="80"> 
    <Grid x:Name="myGrid"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="1*" MinWidth="100"/> 
      <ColumnDefinition Width="2*" MinWidth="200" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition MinHeight="50" /> 
     </Grid.RowDefinitions> 

     <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock> 
     <TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow"/> 
    </Grid> 

Nếu bạn chỉ cần thêm các setter tài sản SizeToContent trở lại đoạn mã trên ... bạn sẽ thấy một số hành vi kỳ lạ nơi hộp ban đầu phát triển với nội dung văn bản .. tuy nhiên nếu bạn thay đổi kích thước cửa sổ một lần .. các textbox sẽ ngừng phát triển. Lạ thật ... không thể giải thích được hành vi đó.
HTH

0

Thay đổi ColumnDefinition thứ hai thành Width = "*".

+1

này sẽ vẫn phát triển hộp. Sử dụng * ngụ ý - sử dụng phần còn lại của chiều rộng có sẵn cho Cột # 2 – Gishu

3

Hộp văn bản WPF dường như không có tùy chọn được tích hợp sẵn.

Để giải quyết vấn đề này, bạn có thể sử dụng Hộp văn bản tùy chỉnh báo cáo kích thước mong muốn (0, 0). Đó là một hack xấu xí, nhưng nó hoạt động.

Trong file MainWindow.xaml.cs của bạn:

namespace NS 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     ... 
    } 

    // Ugly HACK because the regular TextBox doesn't allow autoresize to fit the parent but NOT autoresize when the text doesn't fit. 
    public class TextBoxThatDoesntResizeWithText : TextBox 
    { 
     protected override Size MeasureOverride(Size constraint) 
     { 
      return new Size(0, 0); 
     } 
    } 
} 

Sau đó, trong tập tin MainWindow.xaml của bạn:

<Window x:Class="NS.MainWindow" 
    ... 
    xmlns:local="clr-namespace:NS" 
    SizeToContent="WidthAndHeight"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="100" /> 
      <ColumnDefinition MinWidth="200" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition MinHeight="50" /> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock> 

     <local:TextBoxThatDoesntResizeWithText Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" /> 
    </Grid> 
</Window> 
Các vấn đề liên quan