2010-02-18 4 views
4

Все,Custom ListBox: Элегантная и эффективная реализация?

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

Current display http://www.freeimagehosting.net/uploads/2967c2c763.png

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

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

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

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

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

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

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; 
    } 

С уважением,

+0

Чтобы найти какое-либо решение, я думаю, нам сначала нужно будет увидеть источник вашей пользовательской реализации, чтобы увидеть, что может вызвать странное поведение, ваш вопрос подобен «Я сделал этот код , это ошибка, теперь что с этим не так? " Это не поможет, если мы не увидим код. – caesay

ответ

0

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

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

+0

Этот проект явно личный, поэтому я не собираюсь вкладывать в него какие-либо деньги, кроме моего времени. В личном плане результат является приемлемым на данный момент. Я уже пробовал перед использованием DataGridView, но я не был соблазнен рендером. Наконец, я попытаюсь выполнить рекомендации, указанные в ссылке, приведенной в исходном сообщении, и посмотреть, исправляет ли она проблему. Когда это будет сделано, я дам обновленную информацию о результатах. – camous

1

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

0

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

0

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

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 
Смежные вопросы