.net 是否有Linux mono';s拒绝承认我已调整VirtualMode ListView列的大小?

.net 是否有Linux mono';s拒绝承认我已调整VirtualMode ListView列的大小?,.net,linux,listview,mono,virtualmode,.net,Linux,Listview,Mono,Virtualmode,调整列的大小时,它不会使用更新的对齐方式重新绘制数据。我尝试过无效、刷新和其他一些事情。什么都没起作用。有人知道解决方法吗?我还没有在mono for Windows中尝试过这个 要了解我的意思,请将此控件放到窗体上,然后在mono for Linux中运行它: using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Drawing;

调整列的大小时,它不会使用更新的对齐方式重新绘制数据。我尝试过无效、刷新和其他一些事情。什么都没起作用。有人知道解决方法吗?我还没有在mono for Windows中尝试过这个

要了解我的意思,请将此控件放到窗体上,然后在mono for Linux中运行它:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

class MyListView : ListView
{
  private readonly List<ListViewItem> items_ = new List<ListViewItem>();
  public MyListView()
  {
    VirtualMode = true;
    Columns.Add("Col 1");
    Columns.Add("Col 2");
    Columns.Add("Col 3");
    Add(new ListViewItem(new[] { "a", "b", "c" }));
    Add(new ListViewItem(new[] { "a", "b", "c" }));
    Add(new ListViewItem(new[] { "a", "b", "c" }));
    Add(new ListViewItem(new[] { "a", "b", "c" }));
    Add(new ListViewItem(new[] { "a", "b", "c" }));
  }
  protected override void OnRetrieveVirtualItem(RetrieveVirtualItemEventArgs e)
  {
    e.Item = items_[e.ItemIndex];
    base.OnRetrieveVirtualItem(e);
  }
  public void Add(ListViewItem item)
  {
    items_.Add(item);
    VirtualListSize = items_.Count;
  }
  protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
  {
    e.DrawText();
    base.OnDrawColumnHeader(e);
  }
  protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
  {
    var text = ((ListViewItem.ListViewSubItem)e.SubItem).Text;
    using (var brush = new SolidBrush(e.SubItem.ForeColor))
    {
      e.Graphics.DrawString(text, Font, brush, e.Bounds);
    }
    base.OnDrawSubItem(e);
  }
  protected override void OnColumnWidthChanged(ColumnWidthChangedEventArgs e)
  {
    base.OnColumnWidthChanged(e);
    Invalidate(true); // Nope, that didn't work
    Refresh(); // Nope, that didn't work
  }
}
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用System.Windows.Forms;
使用系统图;
类MyListView:ListView
{
私有只读列表项\=new List();
公共MyListView()
{
VirtualMode=true;
列。添加(“第1列”);
列。添加(“第2列”);
列。添加(“第3列”);
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
}
RetrieveVirtualItem上受保护的覆盖无效(RetrieveVirtualItemEventArgs e)
{
e、 项目=项目[e.ItemIndex];
基于检索虚拟项目(e);
}
公共作废添加(ListViewItem)
{
项目\添加(项目);
VirtualListSize=项目计数;
}
受保护的覆盖无效OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
e、 DrawText();
底端.柱头(e);
}
受保护的覆盖无效OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
var text=((ListViewItem.ListViewSubItem)e.SubItem).text;
使用(var笔刷=新的SolidBrush(e.子项.前景色))
{
e、 绘图字符串(文本、字体、画笔、e.Bounds);
}
基数:分项(e);
}
ColumnWidthChanged(ColumnWidthChangedEventArgs e)上的受保护覆盖无效
{
基础。更改了列宽(e);
无效(正确);//不,那不起作用
刷新();//不,那不行
}
}

我想出来了。虽然我存储和重用ListViewItem实例的方法在Windows中运行良好,但mono更希望我在OnRetrieveVirtualItem的主体中重新创建它们。

BTW,我知道代码有问题(就像构造函数中的所有内容一样)。这只是为了便于测试问题。