展开 ListBox 中的选定项高度

3

本文介绍了展开 ListBox 中的选定项高度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

有没有办法让 SelectedItem 的高度大于 ListBox 中的其他项目?这是我现在拥有的,但它只是作为一个普通的列表框:

Is there a way that I can have the SelectedItem's height larger than the rest of the items in a ListBox? This is what I have right now, yet it just acts as a normal listbox:

public class BuddyListBox : ListBox
{

    public BuddyListBox() 
    {
        this.ResizeRedraw = true;
        this.DoubleBuffered = true;
        this.BorderStyle = BorderStyle.None;
        this.Dock = DockStyle.Fill;
        this.DrawMode = DrawMode.OwnerDrawVariable;
        this.ItemHeight = 16;
    }
    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        if (e.Index == -1 || e.Index >= this.Items.Count)
            return;

        Buddy current = (Buddy)this.Items[e.Index];
        //Bitmap icon = current.StatusImage;

        //e.Graphics.DrawImage(icon, e.Bounds.Left, e.Bounds.Top, 16, 16);
        e.DrawBackground();
        e.Graphics.DrawString(current.Address, e.Font, new SolidBrush(current.Status != BuddyStatus.offline ? e.ForeColor : Color.DarkGray), 16 + e.Bounds.Left, e.Bounds.Top);
        e.Graphics.DrawString(current.Status.ToString(), e.Font, new SolidBrush(Color.LightGray), e.Bounds.Right - (int)(e.Graphics.MeasureString(current.Status.ToString(), e.Font).Width) - this.Margin.Right, e.Bounds.Top);
        e.DrawFocusRectangle();
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        this.Refresh();
    }

    protected override void OnMeasureItem(MeasureItemEventArgs e)
    {
        if (e.Index == this.SelectedIndex)
            e.ItemHeight = this.ItemHeight * 2;
        else
            e.ItemHeight = this.ItemHeight;
    }
}

推荐答案

当 DrawMode 为 OwnerDrawFixed 时,您的 OnMeasureItem 没有执行任何操作.将模式更改为 OwnerDrawVariable.

Your OnMeasureItem isn't doing anything while the DrawMode is OwnerDrawFixed. Change the mode to OwnerDrawVariable.

不幸的是,MeasureItem 事件仅在创建句柄时发生,所以这里有一个解决方法:

Unfortunately, the MeasureItem event only happens when the handle gets created, so here is a work-around:

public class BuddyListBox  : ListBox
{
  int thisIndex = -1;

  public BuddyListBox()
  {
    this.DrawMode = DrawMode.OwnerDrawVariable;
  }

  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);
      e.Graphics.DrawString(this.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds.Left, e.Bounds.Top);
      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)
        e.ItemHeight = 32;
      else
        e.ItemHeight = 16;
    }
    base.OnMeasureItem(e);
  }
}

这篇关于展开 ListBox 中的选定项高度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

C# 中的多播委托奇怪行为?
Multicast delegate weird behavior in C#?(C# 中的多播委托奇怪行为?)...
2023-11-11 C#/.NET开发问题
6

参数计数与调用不匹配?
Parameter count mismatch with Invoke?(参数计数与调用不匹配?)...
2023-11-11 C#/.NET开发问题
26

如何将代表存储在列表中
How to store delegates in a List(如何将代表存储在列表中)...
2023-11-11 C#/.NET开发问题
6

代表如何工作(在后台)?
How delegates work (in the background)?(代表如何工作(在后台)?)...
2023-11-11 C#/.NET开发问题
5

没有 EndInvoke 的 C# 异步调用?
C# Asynchronous call without EndInvoke?(没有 EndInvoke 的 C# 异步调用?)...
2023-11-11 C#/.NET开发问题
2

Delegate.CreateDelegate() 和泛型:错误绑定到目标方法
Delegate.CreateDelegate() and generics: Error binding to target method(Delegate.CreateDelegate() 和泛型:错误绑定到目标方法)...
2023-11-11 C#/.NET开发问题
14