Custom ListBox: элегантная и эффективная реализация? - PullRequest
4 голосов
/ 19 февраля 2010

All

В настоящее время я работаю над настройкой ListBox, чтобы улучшить четкость моего приложения. В принципе, довольно легко найти «как» для этой цели, приводящей к моему текущему результату ниже.

Current display

Я доволен дисплеем, но ... Я столкнулся со странным поведением с колесом мыши. Я попытался найти информацию по этой проблеме, и я нашел эту статью:

http://aviationxchange.net/wikis/winforms/net-color-listbox.aspx

которые указывают на то, что проблема с колесом мыши не единственная (простое копирование / вставка по ссылке)

  • Горизонтальная полоса прокрутки исчезла. Только строки фиксированной длины меньше чем ширина контроля может быть отображается. Что делать, если контроль изменить размер?
  • Если вы пытались использовать мышь колесо, вы могли заметить, что выбранный элемент перемещается вверх и вниз хаотично, когда колесо прокрутки переехал.
  • переопределяемые методы OnPaint () OnPaintBackGround () не работать на всех. Просто они не подключен к событиям. Фон окрашивается только через сообщения Windows.

Это дает некоторые советы по исправлению этих проблем, но я чувствую себя довольно разочарованным, чтобы реализовать все эти «обходные пути» для отображения пользовательского списка. Я что-то пропустил? есть ли какой-нибудь элемент управления winform, который позволяет мне такие же настройки, но более чистым / элегантным способом? Я не смог найти больше информации: /

Ниже добавлена ​​соответствующая часть пользовательской части чертежа, но я не уверен, что проблема отображения действительно связана с реализацией переопределенного метода, больше с самим элементом управления.

    public RecordListBox(): base()
    {
        mListBox = this;

        mListBox.DrawItem += new DrawItemEventHandler(mListBox_DrawItem);
        mListBox.MeasureItem += new MeasureItemEventHandler(mListBox_MeasureItem);
        this.DrawMode = DrawMode.OwnerDrawFixed;

    }

    public void mListBox_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (this.DesignMode) return;

        e.DrawBackground();
        e.DrawFocusRectangle();

        // drawing actions

    }

    public void mListBox_MeasureItem(object sender, MeasureItemEventArgs e)
    {
        e.ItemHeight = 40;
    }

С уважением,

Ответы [ 4 ]

1 голос
/ 23 февраля 2010

Исходя из указанной ссылки, вы должны переопределить void WndProc (ref Message m), чтобы иметь возможность управлять проблемой колеса мыши. Если вы собираетесь развернуть свой собственный пользовательский элемент управления на основе существующего объекта окна (даже UserControl), вам придется переопределить ряд методов и свойств, чтобы сделать элемент управления нужным. Данная ссылка выглядит как хорошее начало. Реализуйте эти функции вместе с переопределением для MeasureItem и посмотрите, где вы окажетесь. Но если вы хотите создать пользовательский элемент управления, это в основном просто метод проб и ошибок с большим количеством исследований.

0 голосов
/ 11 апреля 2012

Вот так я решил проблему с прокруткой мыши. Это все еще немного изменчиво, но намного лучше, чем вообще не работает.

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

'Mouse scroll bug - Yay microsoft
    If m.Msg = &H20A Then
        ' Trap WM_MOUSEWHEEL
        If CType(m.WParam, Integer) > 0 Then
            'Scroll Up
            SendMessage(Me.Handle, 277&, 0&, vbNull)
        Else
            'Scroll down
            SendMessage(Me.Handle, 277&, 1&, vbNull)
        End If
    End If
0 голосов
/ 11 октября 2011

Похоже, вы можете использовать просмотр списка для ваших целей.Проверьте это удивительное пользовательское представление списка: ObjectListView .

0 голосов
/ 19 февраля 2010

Реализация пользовательских элементов управления - это волшебство само по себе.Прежде чем тратить время на разработку полной реализации ListBox, вам лучше купить его у стороннего поставщика (например, DevExpress, Telerik, Infragistics, ComponentOne).На всех их страницах есть демоверсии, чтобы вы могли проверить, соответствуют ли они вашим потребностям.

Если вы хотите реализовать это самостоятельно, возможно, попробуйте использовать DataGridView вместо списка.Ячейки, нарисованные владельцем, дают вам возможность настраивать их всеми возможными способами.

...