drawwitem事件仅在用户单击列表框时触发

本文关键字:列表 单击 事件 用户 drawwitem | 更新日期: 2023-09-27 18:08:49

我正在使用VS 2015用c#编写一个客户端/服务器WinForms应用程序。

我有一个ListBox控件,其DrawItem事件是owner-drawn(是的,我设置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() ?

drawwitem事件仅在用户单击列表框时触发

经过一些研究,我找到了解决方案:当控件被更改时,调用DrawItem事件。

事实上,.Add()做到了。我这样修改了我的更新函数:

private void getMessages()
{
    // ... <--- connection logic here
    chatLobby.Items.Add(" "); // Alters the listbox
}