2008-12-22 44 views
11

Tôi gặp sự cố. Tôi cần lưu trữ lưới bằng các nút điều khiển trong ScrollViewer để ngăn không cho hộp văn bản bị cắt bớt hoặc bị thu gọn về 0 với giao diện người dùng. Ngoài ra tôi muốn với hộp văn bản được mở rộng khi người dùng thay đổi chiều rộng cửa sổ. Tôi đang thiết nội dung Window để mã sauHộp văn bản WPF và hành vi Di chuyển

<DockPanel> 
    <TreeView DockPanel.Dock="Left" Width="150"/> 
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="Name" 
         Margin="5" 
         VerticalAlignment="Center"/> 
      <TextBox Grid.Column="1" 
        Text="Some Name" 
        Margin="5" 
        VerticalAlignment="Center" 
        MinWidth="200"/> 
     </Grid> 
    </ScrollViewer> 
</DockPanel> 

Tất cả làm việc tốt, nhưng khi người dùng nhập văn bản rất dài trong TextBox nó đang được mở rộng và cuộn ngang sẽ xuất hiện. Có cách nào dễ dàng để giới hạn chiều rộng tối đa của TextBox và cho phép nó được mở rộng chỉ khi người dùng thay đổi kích thước cửa sổ.

Trả lời

31

Vấn đề là các thành phần chính cung cấp cho TextBox nhiều không gian như nó nghĩ, và khi có nhiều văn bản hơn, nó sẽ mở rộng thay vì ở kích thước tự động ban đầu.

Một giải pháp ở đây là để thực hiện một yếu tố tự động kích thước và ràng buộc TextBox.Width với nó:

<DockPanel> 
    <TreeView Width="150" DockPanel.Dock="Left"/> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/> 
      <Border x:Name="b" Grid.Column="1" Margin="5"/> 
      <TextBox Width="{Binding ActualWidth, ElementName=b}" 
        MinWidth="200" 
        Grid.Column="1" 
        Margin="5" 
        VerticalAlignment="Center" 
        Text="Some Name"/> 
     </Grid> 
    </ScrollViewer> 
</DockPanel> 

Lưu ý rằng chúng tôi thiết lập thuộc tính Margin của phần tử tự động kích thước (Border). này rất quan trọng vì nếu nó không được thiết lập, sẽ có một vòng lặp:

  1. Độ rộng đường viền autosizes chiều rộng cột Lưới
  2. rộng TextBox thay đổi kích thước để Border.ActualWidth
  3. Lưới cột chiều rộng thay đổi kích thước chiều rộng TextBox + lề TextBox
  4. Độ rộng đường viền autosizes to Grid rộng cột lại

Bằng cách đặt các Margin để giống như TextBox, thay đổi kích thước của TextBox sẽ không ảnh hưởng đến Gri d kích thước.

+0

Thanks ... đó là tuyệt vời! – Jose

+1

Sau khi mày mò với mã dựa trên giải pháp của Robert, tôi thấy hữu ích khi ràng buộc MaxWidth của một hộp văn bản với phần tử kèm theo. Dường như để tránh các vấn đề với vòng lặp vô hạn thay đổi kích thước cho một số ứng dụng. – estanford

+3

Hoạt động tốt, nhưng giờ đây TextBox vẫn ở kích thước lớn khi cửa sổ được làm nhỏ hơn. Bất kỳ sửa chữa cho điều đó? – Heinzi

0

không - đây là vấn đề nổi tiếng của wpf và dự kiến ​​sẽ được khắc phục trong bản phát hành tiếp theo. nhờ

2

Overriding TextBox.MeasureOverride như vậy làm việc cho tôi:

protected override Size MeasureOverride(Size constraint) 
{ 
    Size origSize = base.MeasureOverride(constraint); 
    origSize.Width = MinWidth; 
    return origSize; 
} 
+0

Và làm thế nào để bạn liên kết MinWidth với Cột kèm theo? –

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