2012-01-31 41 views
5

マイUI:私のUIのGridViewColumn幅調整

<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> 

分離コード:

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

マイエンティティ:

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

GridViewColumnsがGridViewColumn-ヘッダーの幅を持っています。長い名前のPersonでUpdate()を呼び出す場合でも。列のサイズが変更されません。

a)最長の名前の長さに値x(私は列の最大幅を指定したい)を超えないように、自動的に "名前"列のサイズを変更できます?

b)「年齢」 - 列がコントロールの最後のスペースを塗りつぶすように指定できます(グリッドビューの列がコントロールの幅全体を使用するように)。

答えて

6

GridViewのサイズが自動的に変更されません。

は、列のサイズを変更するにはあなた、私は、コンバータでそれを行うエリアを埋めるために、最後のサイジングについては

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; 
    } 

することができます。私はこのコンバータはあなたがこれに必要なものを正確に行うとは思わないが、それはあなたを始めなければならない。

<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は高速ですが、少し赤ちゃんが座っています。

+0

これはかなり古いですが、強調したいのは、 'ColumnWidth'修正のタイミングがどれほど重要で、正しく適用されたときに本当にうまくいくかです。 GridViewコンテナが読み込まれ、表示されていることを確認してください。私は、GridViewが仮想化する親コントロールの一部であったエクスパンダの中に配置されているという非常に厄介な組み合わせを持っていました。つまり、オフスクリーンでサイズを変更すると幅がゼロになり、テンプレートが異なるデータ用にリサイクルされたときにアイテムが変更される可能性があります。今私は私の解決策に満足しています。 – grek40

1

は私がすべてであなたを助ける

<Window.Resources> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
    </Style> 
</Window.Resources> 

How to autosize and right-align GridViewColumn data in WPF?からこれを引っ張っ?

+0

私のために働いた!ありがとう – Omer

関連する問題