2015-08-20 7 views
1

Я пишу приложение клиент/сервер, WinForms в C# с помощью VS 2015DrawItem событие вызывается только тогда, когда пользователь нажимает на ListBox

У меня есть ListBox управления которого DrawItem событие owner- нарисовано (да, я установил свойство DrawMode на OwnerDrawFixed), которое нужно перерисовывать каждый раз при получении нового сообщения.

Я использую эту функцию обратного вызова после этого reference:

private void chatLobby_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 

    int ItemMargin = 0; 
    string last_u = ""; 

    foreach(Message m in ChatHistory[activeChatID]) 
    { 
     // Don't write the same user name 
     if(m.from.name != last_u) 
     { 
      last_u = m.from.name; 

      e.Graphics.DrawString(last_u, ChatLobbyFont.Username.font, ChatLobbyFont.Username.color, e.Bounds.Left, e.Bounds.Top + ItemMargin); 
       ItemMargin += ChatLobbyFont.Message.font.Height; 
     } 

     e.Graphics.DrawString(" " + m.message, ChatLobbyFont.Message.font, ChatLobbyFont.Message.color, e.Bounds.Left, e.Bounds.Top + ItemMargin); 

     ItemMargin += ChatLobbyFont.Message.font.Height; 
    } 

    e.DrawFocusRectangle(); 
} 

И это MeasureItem метод:

private void chatLobby_MeasureItem(object sender, MeasureItemEventArgs e) 
{ 
    // No messages in the history 
    if(ChatHistory[activeChatID][0] == null) 
    { 
     e.ItemHeight = 0; 
     e.ItemWidth = 0; 
    } 

    string msg = ChatHistory[activeChatID][e.Index].message; 

    SizeF msg_size = e.Graphics.MeasureString(msg, ChatLobbyFont.Message.font); 

    e.ItemHeight = (int) msg_size.Height + 5; 
    e.ItemWidth = (int) msg_size.Width; 
} 

Сообщение будет получен и вставлен с помощью ListBox.Add() и он работает, подтверждается отладчик.

Но ListBox перерисовывается, только когда я нажимаю его (Я думаю, что он срабатывает в фокусе).

Я уже пробовал .Update(), .Refresh() и .Invalidate()не повезло.

Есть ли способ вызвать DrawItem() из кода?

ответ

0

После некоторых исследований я нашел решение: Событие DrawItem вызывается, когда элемент управления изменяется.

По сути, .Add() делает трюк. я изменил свою функцию обновления с этим:

private void getMessages() 
{ 
    // ... <--- connection logic here 

    chatLobby.Items.Add(" "); // Alters the listbox 
} 
+0

Но теперь он вызывает мерцание, как он перерисовывает строку ниже нового элемента ... – Nomid

+0

Я решил мигания: Я добавил элементы в ListBox обычно вместо чтения 'ChatHistory'. – Nomid

 Смежные вопросы

  • Нет связанных вопросов^_^