WinForms 中多余的滚动条
本文关键字:滚动条 多余 WinForms | 更新日期: 2023-09-27 18:31:15
我有一个WinForms应用程序,该应用程序带有一个ListView
,可随主程序窗口进行缩放。在调整大小时,我调整列的宽度以适应ListView
的整个宽度。现在,当我从全屏切换到正常时,我得到一个水平滚动条。此滚动条无法滚动,即它覆盖的宽度是列表视图宽度的 100%。换句话说,我想摆脱这个滚动条。如果我很快触摸窗口调整大小处理程序,而没有实际调整窗口大小,则会重新计算宽度并消失滚动条。如何自动摆脱该滚动条?
column1.Width = fixedWidth;
column2.Width = listView.Width - fixedWidth - System.Windows.Forms.SystemInformation.VerticalScrollBarWidth;
有两个问题。 它从使用列表视图的 Width 属性开始。 这在带有边框的列表视图上是不正确的,您需要使用 ClientSize.Width 属性。 第二个问题与计算自动布局的方式有关,它会导致 Resize 事件过早触发。 您可以通过使用 Control.BeginInvoke() 延迟调整来解决此问题。 喜欢这个:
private void listView1_Resize(object sender, EventArgs e) {
this.BeginInvoke(new Action(() => {
var lv = (ListView)sender;
var w = 0;
for (int ix = 0; ix < lv.Columns.Count - 1; ++ix) w += lv.Columns[ix].Width;
w = Math.Max(0, lv.ClientSize.Width - w);
lv.Columns[lv.Columns.Count - 1].Width = w;
}));
}
要用最后一列的宽度填充剩余空间,您可以这样做,当然,每当调整表单大小时,我们都必须这样做:
//Resize event handler for your Form1
private void Form1_Resize(object sender, EventArgs e){
column2.Width = -2;
}
//ColumnWidthChanged event handler
private void listView1_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e){
int lastIndex = listView1.Columns.Count - 1;
if (e.ColumnIndex != lastIndex) listView1.Columns[lastIndex].Width = -2;
}
//ColumnWidthChanging event handler
private void listView1_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e){
int lastIndex = listView1.Columns.Count - 1;
if (e.ColumnIndex != lastIndex) listView1.Columns[lastIndex].Width = -2;
}
注意:你说你的ListView
缩放了with the main program window
,我不知道你做了什么来实现这一点,但我建议你应该使用 Anchor
属性,设置listView1.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
。