2016-09-07 8 views
0

目的:ウィンドウサイズが変更されたときにWPFグリッドで子リストウィンドウの列のサイズをプログラムで変更し、WPFリストビュー列の比例リサイズ中に水平スクロールバーを回避する方法

現在、比例リサイズは非常にうまくいきます。ただし、ウィンドウの幅を小さくすると、スクロールするスペースがわずかな水平スクロールバーが表示されます。これは、Widthプロパティが列間のグラフィックディバイダを考慮していないためかどうかと疑問に思っていますか?..または..?

問題を引き起こしている部分は、残りのスペースを埋めるために最後の列の幅を拡張する最後のセクションです。私は試行&エラー(ある程度はうまくいく可能性があります)から生成するいくつかのマジックナンバーを減算したくありません。

とはい、最終的に私は垂直スクロールバーの有無を説明しますが、今は水平スクロールバーを見ることを避けたいだけです。ここで

は、リストビューの列のサイズを変更したコードです:

LV_FileList.SizeChanged += this.onLV_FileList_SizeChanged; 

...

/// <summary> 
/// Proportionally resize listview columns when listview size changes 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
private void onLV_FileList_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    if ((sender is ListView) && 
     (e.PreviousSize.Width > 0)) 
    { 
     double total_width = 0; 
     GridViewColumnCollection gvcc = ((GridView)(sender as ListView).View).Columns; 
     foreach (GridViewColumn gvc in gvcc) 
     { 
      gvc.Width = (gvc.Width/e.PreviousSize.Width) * e.NewSize.Width; 
      total_width += gvc.Width; 
     } 

     //Increase width of last column to fit width of listview if integer division made the total width to small 
     if (total_width < e.NewSize.Width) 
     { 
      gvcc[gvcc.Count - 1].Width += (e.NewSize.Width - total_width); 
     } 
    } 
} 

私は問題のセクションにWhileループを追加しましたが、それは動作していないの不幸な効果を持っています。 ComputedHorizo​​ntalScrollBarVisibilityPropertyの値は、最後の列の幅が減少するにつれて変化しないので、0になり、列の幅に対して無効な値の例外がスローされます。私はループ内でLV_FileList.UpdateLayout()を呼び出すことを試みたが、おそらくリストビューコントロールの表示をリフレッシュする必要があるか、または水平スクロールバーが消える前に何かを考えていた。サイコロはありません。

   //Increase width of last column to fit width of listview if integer division made the total width to small 
      if (total_width < e.NewSize.Width) 
      { 
       gvcc[gvcc.Count - 1].Width += (e.NewSize.Width - total_width); 
       while ((Visibility)LV_FileList.GetValue(ScrollViewer.ComputedHorizontalScrollBarVisibilityProperty) == Visibility.Visible) 
       { 
        gvcc[gvcc.Count - 1].Width--; 
        //LV_FileList.UpdateLayout(); <-- doesn't help 
       } 
      } 

答えて

0

は、ここで私がなってしまったものです。垂直スクロールバーも処理します。私が今までに見つけた1つの欠点は、ユーザーがウィンドウのサイズを変更している間に水平スクロールバーが一時的に点滅することです。誰かがもっと良い方法を知っているなら、投稿してください!ありがとう!

 /// <summary> 
    /// Proportionally resize listview columns when listview size changes 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void onLV_FileList_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     if ((sender is ListView) && 
      (e.PreviousSize.Width > 0)) 
     { 
      double total_width = 0; 
      GridViewColumnCollection gvcc = ((GridView)(sender as ListView).View).Columns; 
      foreach (GridViewColumn gvc in gvcc) 
      { 
       gvc.Width = (gvc.Width/e.PreviousSize.Width) * e.NewSize.Width; 
       total_width += gvc.Width; 
      } 

      //Increase width of last column to fit width of listview if integer division made the total width to small 
      if (total_width < e.NewSize.Width) 
      { 
       gvcc[gvcc.Count - 1].Width += (e.NewSize.Width - total_width); 
      } 

      //Render changes to ListView before checking for horizontal scrollbar 
      this.AllowUIToUpdate(); 

      //Decrease width of last column to eliminate scrollbar if it is displayed now 
      ScrollViewer svFileList = this.FindVisualChild<ScrollViewer>(LV_FileList); 
      while ((svFileList.ComputedHorizontalScrollBarVisibility != Visibility.Collapsed) && (gvcc[gvcc.Count - 1].Width > 1)) 
      { 
       gvcc[gvcc.Count - 1].Width--; 
       this.AllowUIToUpdate(); 
      } 
     } 
    } 


    /// <summary> 
    /// Threaded invocation to handle updating UI in resize loop 
    /// </summary> 
    private void AllowUIToUpdate() 
    { 
     DispatcherFrame dFrame = new DispatcherFrame(); 

     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, new DispatcherOperationCallback(delegate(object parameter) 
     { 
      dFrame.Continue = false; 
      return null; 

     }), null); 

     Dispatcher.PushFrame(dFrame); 
    } 
0

HorizontalScrollBarVisibilityプロパティを無効に設定する必要があります。

myListView.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, 
    ScrollBarVisibility.Disabled); 

またはXAMLで...

<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
+0

これは確かに述べた問題を解決しますが、もう1つ作成します。 1つまたは複数の「中間」列の幅を増やすために列分割線をドラッグすると、最後の列の右端に到達できなくなります。私は、ユーザーがウィンドウの幅を変更した直接の結果として、水平スクロールバーの*自動表示を抑制したいだけです。 – MikeGeek

関連する問題