2012-01-31 28 views
5

UI của tôi:GridViewColumn Width Adjustment

<ListView Name="persons" SelectionChanged="persons_SelectionChanged"> 
     <ListView.View> 
      <GridView AllowsColumnReorder="False"> 
       <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="auto"/> 
       <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="auto"/> 
      </GridView> 
     </ListView.View> 
    </ListView> 

codebehind của giao diện người dùng của tôi:

internal void Update(IEnumerable<Person> pers) 
    { 
     this.persons.ItemsSource = null; 
     this.persons.ItemsSource = pers; 
     UpdateLayout(); 
    } 

Đối tượng của tôi:

class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

Các GridViewColumn có độ rộng của GridViewColumn-Header. Ngay cả khi tôi gọi Update() với Người có tên dài. Cột không được thay đổi kích thước.

a) Làm cách nào tôi có thể tự động đổi kích thước cột "Tên" (khi tôi gọi là Cập nhật) thành độ dài của tên dài nhất, nhưng không dài hơn Giá trị x (tôi muốn chỉ định chiều rộng tối đa của cột) ?

b) Làm cách nào tôi có thể chỉ định rằng "Độ tuổi" -Molumn lấp đầy khoảng trống vào đầu điều khiển (sao cho các cột của chế độ xem lưới sử dụng toàn bộ chiều rộng của điều khiển)?

Trả lời

6

GridView không tự động thay đổi kích thước.

Để thay đổi kích thước các cột bạn có thể

foreach (GridViewColumn c in gv.Columns) 
    { 
     // Code below was found in GridViewColumnHeader.OnGripperDoubleClicked() event handler (using Reflector) 
     // i.e. it is the same code that is executed when the gripper is double clicked 
     // if (adjustAllColumns || App.StaticGabeLib.FieldDefsGrid[colNum].DispGrid) 
     if (double.IsNaN(c.Width)) 
     { 
      c.Width = c.ActualWidth; 
     } 
     c.Width = double.NaN; 
    } 

Đối với kích thước cuối cùng để lấp đầy diện tích tôi làm điều đó với một bộ chuyển đổi. Tôi không nghĩ rằng công cụ chuyển đổi này thực hiện chính xác những gì bạn cần cho việc này nhưng nó sẽ giúp bạn bắt đầu.

<GridViewColumn Width="{Binding ElementName=lvCurDocFields, Path=ActualWidth, Converter={StaticResource widthConverter}, ConverterParameter=100}"> 


    [ValueConversion(typeof(double), typeof(double))] 
    public class WidthConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      // value is the total width available 
      double otherWidth; 
      try 
      { 
       otherWidth = System.Convert.ToDouble(parameter); 
      } 
      catch 
      { 
       otherWidth = 100; 
      } 
      if (otherWidth < 0) otherWidth = 0; 

      double width = (double)value - otherWidth; 
      if (width < 0) width = 0; 
      return width; // columnsCount; 

     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

GridView là nhanh nhưng phải mất một chút em bé ngồi.

+0

Tôi biết điều này là khá cũ, nhưng tôi muốn làm nổi bật, tầm quan trọng của thời gian sửa 'ColumnWidth' là gì và nó thực sự hoạt động tốt khi được áp dụng đúng. Đảm bảo rằng vùng chứa GridView được tải và hiển thị. Tôi đã có một sự kết hợp khá khó chịu của một GridView được đặt bên trong một expander đó là lần lượt một phần của một điều khiển cha mẹ ảo hóa. Có nghĩa là, một thay đổi kích cỡ trong khi bị tắt màn hình sẽ mang lại độ rộng bằng không và các mục có thể thay đổi khi mẫu được tái chế cho các dữ liệu khác nhau. Bây giờ tôi rất hài lòng với giải pháp của tôi. – grek40

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