ListBox строки разной высоты

Надо, чтобы выделенная строка в ListBox была больше (или меньше) остальных. Включаю OwnerDrawVariable и пишу код:


        private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
        {
            int n = listBox1.SelectedIndex == e.Index ? 30 : 14;
            System.Diagnostics.Debug.WriteLine($"index measured: {e.Index}, selected: {listBox1.SelectedIndex}, n: {n}");
            e.ItemHeight = n;
        }

        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (e.Index >= 0)
            {
                bool isSelected = (e.State & DrawItemState.Selected) == DrawItemState.Selected;
                string t = listBox1.Items[e.Index].ToString();
                e.Graphics.DrawString(t, listBox1.Font, Brushes.Lime, new PointF(0.0f, e.Bounds.Y));
                if (isSelected)
                {
                    e.Graphics.DrawRectangle(Pens.White, e.Bounds);
                }
            }
        }

        private void listBox1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }

        private void listBox1_DragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] strings = (string[])e.Data.GetData(DataFormats.FileDrop);
                listBox1.Items.AddRange(strings);
            }
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            listBox1.Refresh();
        }

Однако, все строчки всегда выводятся одинакового размера. Если я правильно понял, в DrawItem e.Bounds должен приходить тот, что был установлен в Measureitem. Но он для всех айтемов приходит одинаковый.
Что я опять упустил?

Да все работает.

У вас при щелчке не происходит перерисовка. поэтому он и не меняет их относительно изменения выделенного элемента.

Вот тут решение

а это не то?

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            listBox1.Refresh();
        }

В консоль же текст сыпется при щелчке.

рефреш не перестраивает структуру элементов. Там по ссылке посмотрите как делают.

Там пишут, что мерцать будет. А двойная буферизация поможет?

Попробуйте. Это вроде как нестандартный рендеринг. Он очевидно что будет через костыли.
В wpf это вроде как проще сделать. Либо DataGridView … он поддерживает разную высоту строк.

Попробовал первый способ. Вообще не работает. Все строчки одинакового размера. А второй способ работает, но там StackOverflowException когда SelectedIndex != -1.

А чего тут нестандартного? Обычная потребность. Могли бы реализовать, до кучи. Вместо всяких LinkLabel и т.п.

Подайте заявку в MS с описанием проблемы.

Есть датагрид с динамической шириной. Пользуйте его.