如果你真的想做这样的改变,最好的方法是创建一个UserControl,它承载一个ListView,并为你的UserControl实现这样的属性和方法。
例如:
//Just for sample, you should add some checks and raise some events and throw some exceptions.
public int SelectedIndex
{
get
{
var selectedIndex = -1;
if (this.listView1.SelectedItems.Count == 1)
selectedIndex = this.listView1.SelectedItems[0].Index;
return selectedIndex;
}
set
{
this.listView1.SelectedItems.Cast<ListViewItem>()
.ToList().ForEach(item =>
{
item.Selected = false;
});
this.listView1.Items[value].Selected = true;
}
}
实现用户控制是为了独立于ListView,而不是暴露ListView成员。但是如果你不关心它,你可以从ListView继承并添加你想要的属性和方法,例如:
public int IndexFromPoint(Point p)
{
return this.IndexFromPoint(p.X, p.Y);
}
public int IndexFromPoint(int x, int y)
{
var item = this.HitTest(x, y).Item;
if (item != null)
return item.Index;
return -1;
}
private string displayMember;
[Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public string DisplayMember
{
get
{
return displayMember;
}
set
{
displayMember = value;
}
}
private string valueMember;
[Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public string ValueMember
{
get
{
return valueMember;
}
set
{
valueMember = value;
}
}
编辑
作为另一种听起来不错的选择;您可以创建一个WPF UserControl 来托管一个似乎不受滚动问题影响的WPF ListBox。这样您就可以使用ElementHost 控件在Windows 窗体中托管您的用户控件。
正如我在您向其中添加新项目时测试的那样,滚动条保持在现在的位置。