我在我的winforms應用程序中使用自定義列表框來存放一長串文本。我正在使用自定義列表框來使selectedItem的高度比其他項目大。列表框的代碼:WinForm列表框選定的項目垂直居中並展開高度
public class CustomListBox : System.Windows.Forms.ListBox
{
int thisIndex = -1;
public CustomListBox()
{
this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
this.SelectionMode = System.Windows.Forms.SelectionMode.One;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
if (this.Items.Count > 0)
{
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
else
e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
Font myFont = new Font("Microsoft Sans Serif", 12f, FontStyle.Bold);
object item = this.Items[e.Index];
e.DrawFocusRectangle();
Brush brush = new SolidBrush(e.ForeColor);
SizeF size = e.Graphics.MeasureString(item.ToString(), e.Font);
e.Graphics.DrawString(this.Items[e.Index].ToString(), myFont, Brushes.Black, e.Bounds.Left + (e.Bounds.Width/2 - size.Width/2), e.Bounds.Top + (e.Bounds.Height/2 - size.Height/2));
base.OnDrawItem(e);
}
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);
thisIndex = this.SelectedIndex;
this.RecreateHandle();
}
protected override void OnMeasureItem(MeasureItemEventArgs e)
{
if (e.Index > -1)
{
if (e.Index == thisIndex)
{
System.Diagnostics.Trace.WriteLine("HELLOooooooo");
e.ItemHeight = 70;
}
else
e.ItemHeight = 45;
}
base.OnMeasureItem(e);
}
}
代碼的確有用。我希望列表框中有另一個功能,當我按向下箭頭鍵瀏覽列表時,我希望列表框的selecteditem從頂部開始,移動到屏幕的中心並保持到列表的底部在屏幕上可見,然後轉到最後一項。即所選擇的項目保持居中在屏幕上而不是列表的最開始和結束。
我可以使默認列表框以這種方式更改listbox.TopIndex值。但是,使用customList OnSelectedIndexChanged()重寫,滾動感覺有彈性。
關於如何在同一時間在列表框中居中對齊和擴展selectedItem的任何說明?
您可以將[TopIndex](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.listbox.topindex(v = vs.110).aspx)設置爲計算值當你移動選定的索引。 Math.Min(0,SelectedIndex-VisibleItems/2)使topIndex始終爲零。 – Johnbot