Событие DrawItem вызывается только тогда, когда пользователь щелкает ListBox
Я пишу клиент-серверное приложение WinForms на C#, используя VS 2015.
У меня есть элемент управления ListBox, событие DrawItem которого отрисовано владельцем (да, я установил для свойства DrawMode значение OwnerDrawFixed), которое необходимо перерисовывать при каждом получении нового сообщения.
Я использую этот обратный вызов после этой ссылки:
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()
из кода?
1 ответ
После некоторых исследований я нашел решение: событие DrawItem вызывается, когда элемент управления изменяется.
По сути дела, .Add()
делает трюк. Я изменил свою функцию обновления с этим:
private void getMessages()
{
// ... <--- connection logic here
chatLobby.Items.Add(" "); // Alters the listbox
}