目的:ウィンドウサイズが変更されたときに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ループを追加しましたが、それは動作していないの不幸な効果を持っています。 ComputedHorizontalScrollBarVisibilityPropertyの値は、最後の列の幅が減少するにつれて変化しないので、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
}
}
これは確かに述べた問題を解決しますが、もう1つ作成します。 1つまたは複数の「中間」列の幅を増やすために列分割線をドラッグすると、最後の列の右端に到達できなくなります。私は、ユーザーがウィンドウの幅を変更した直接の結果として、水平スクロールバーの*自動表示を抑制したいだけです。 – MikeGeek